//区间查询,,单点修改
//区间查询最小值,,单点修改值
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,q,a[N];
struct node{
int minv;
}st[N*4];
void update(int u)
{
st[u].minv=min(st[u*2].minv,st[u*2+1].minv);
}
void build(int u,int l,int r)//l,,r是该节点的区间范围
{
if(l==r) st[u].minv=a[l];
else
{
int mid=l+r>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
//改变操作
update(u);
}
}
//节点为id,节点对应的区间为{l,r},修改a[pos]->val
void change(int u,int l,int r,int pos,int val)
{
if(l==r) st[u].minv=val;
else
{
int mid=l+r>>1;
if(pos<=mid) change(u*2,l,mid,pos,val);
else change(u*2+1,mid+1,r,pos,val);
// 改变该结点
update(u);
}
}
//查询区间{ql,qr}的最小值
// l ,r是该结点的区间范围
int query(int u,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr) return st[u].minv;
int mid=l+r>>1;
if(qr<=mid) return query(u*2,l,mid,ql,qr);
else if(ql>mid) return query(u*2+1,mid+1,r,ql,qr);
else
{
//ql<=mid,qr>mid 区间:{q1,mid} ..{mid+1,qr};
return min(query(u*2,l,mid,ql,mid),query(u*2+1,mid+1,r,mid+1,qr));
}
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int i=0;i<q;i++)
{ int ty;
cin>>ty;
if(ty==1)
{
int x,d;//把x修改成d,单点修改
cin>>x>>d;
change(1,1,n,x,d);
}
else
{
int l,r;
cin>>l>>r;//查询区间l,r;
cout<<query(1,1,n,l,r)<<endl;
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,q,a[N];
struct info{
int minv,mincnt; //最小值,,最小值出现次数
};
//加法 使得左,右子树的最小值出现次数判断是否想加
info operator + (const info &l,const info &r)
{
info a;
a.minv=min(l.minv,r.minv);//存放最小值
if(l.minv==r.minv) a.mincnt=l.mincnt+r.mincnt;
else if (l.minv<r.minv) a.mincnt=l.mincnt;
else a.mincnt=r.mincnt;
return a;
}
struct node{
info val; //线段树的存储数据
}st[N*4];
void update(int u)
{
st[u].val=st[u*2].val+st[u*2+1].val;
}
void build(int u,int l,int r)
{
if(l==r) st[u].val={a[l],1};
else
{
int mid=l+r>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
update(u);
}
}
//节点为id,对应的区间为{l,r},修改a[pos]->val
void change(int u,int l,int r,int pos,int val)
{
if(l==r) st[u].val={val,1};
else
{
int mid=l+r>>1;
if(pos<=mid) change(u*2,l,mid,pos,val);
else change(u*2+1,mid+1,r,pos,val);
// 改变
update(u);
}
}
//查询区间{ql,qr}的最小值
info query(int u,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr) return st[u].val;
int mid=l+r>>1;
if(qr<=mid) return query(u*2,l,mid,ql,qr);
else if(ql>mid) return query(u*2+1,mid+1,r,ql,qr);
else
{
//ql<=mid,qr>mid
return query(u*2,l,mid,ql,mid)+query(u*2+1,mid+1,r,mid+1,qr);
}
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
for(int i=0;i<q;i++)
{ int ty;
cin>>ty;
if(ty==1)
{
int x,d;
cin>>x>>d;
change(1,1,n,x,d);
}
else
{
int l,r;
cin>>l>>r;
auto ans=query(1,1,n,l,r);
cout<<ans.minv<<" "<<ans.mincnt<<endl;
}
}
return 0;
}
区间修改,区间查询
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int n,q,a[N];
struct info{
ll maxv;
};
struct tag{
ll add;
};
info operator + (const info &l,const info &r)
{
return {max(l.maxv,r.maxv)};
}
info operator + (const info &v,const tag &t)
{
return {v.maxv + t.add };
}
tag operator + (const tag &t1,const tag &t2)
{
return {t1.add+t2.add};
}
struct node{
tag t;
info val;
}st[N*4];
void update(int u) //左右子树的和
{
st[u].val=st[u*2].val+st[u*2+1].val;
}
void settag(int u,tag t)
{
st[u].val=st[u].val+t;//该点的最值+t
st[u].t=st[u].t+t;//该结点标记 t
}
void pushdowm(int u)//往下搜索
{ //标记非空
if(st[u].t.add!=0) //该节点有标记
{
settag(u*2,st[u].t);//左子树
settag(u*2+1,st[u].t);//搜索右子树
st[u].t.add=0;//该树节点变成0
}
}
void build(int u,int l,int r)
{
if(l==r) st[u].val={a[l]};//此节点数据
else
{
int mid=l+r>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
update(u);
}
}
//节点为id,对应的区间为{l,r},
void modify(int u,int l,int r,int ql,int qr,tag t)
{
if(l==ql&&r==qr)
{settag(u,t); return ;}
int mid=l+r>>1;
//重要!!
pushdowm(u);
if(qr<=mid) modify(u*2,l,mid,ql,qr,t);
else if(ql>mid) modify(u*2+1,mid+1,r,ql,qr,t);
else
{
//ql<=mid,qr>mid
modify(u*2,l,mid,ql,mid,t);
modify(u*2+1,mid+1,r,mid+1,qr,t);
}
update(u);
}
//查询区间{ql,qr}的最小值
info query(int u,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr) return st[u].val;
int mid=l+r>>1;
//重要!!
pushdowm(u);
if(qr<=mid) return query(u*2,l,mid,ql,qr);
else if(ql>mid) return query(u*2+1,mid+1,r,ql,qr);
else
{
//ql<=mid,qr>mid
return query(u*2,l,mid,ql,mid)+query(u*2+1,mid+1,r,mid+1,qr);
}
}
int main()
{
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);//建树
for(int i=0;i<q;i++)
{ int ty;
cin>>ty;
if(ty==1)
{
int l,r,d;// 区间{l,r}++d
cin>>l>>r>>d;
modify(1,1,n,l,r,(tag){d});
}
else
{
int l,r;
cin>>l>>r;
auto ans=query(1,1,n,l,r);
cout<<ans.maxv<<endl;
}
}
return 0;
}
666