标签:clu oid lazy UI 清除 区间 turn upd std
线段树的区间更新,也是模板题了,,,好像还是比较简单的那种,,,,
lazy[maxn]标记,如果更新的节点被要更新的区间包括的话就加一个lazy标记,停止更新,等到下次再更新到这个节点的时候,就把这个节点pushdown(放下),//更新左子树和右子树并把lazy标记清除;
# include <cstdio>
# include <cstring>
# include <iostream>
# include <algorithm>
using namespace std;
const int maxn=2e5+5;
int grd[maxn*4];
void build(int l,int r,int rt){
if(l==r) {
scanf("%d",&grd[rt]);
return ;
}
int m=(l+r)>>1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
grd[rt]=max(grd[rt<<1],grd[rt<<1|1]);
}
void update(int l,int r,int rt,int a,int m){
if(l==r&&r==a){
grd[rt]=m;
return ;
}
int mid=(l+r)/2;
if(a<=mid) update(l,mid,rt<<1,a,m);
else update(mid+1,r,rt<<1|1,a,m);
grd[rt]=max(grd[rt<<1],grd[rt<<1|1]);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R) return grd[rt];
int maxx=0;
int mid=(l+r)/2;
if(L<=mid) maxx=max(maxx,query(L,R,l,mid,rt<<1));
if(R>mid) maxx=max(maxx,query(L,R,mid+1,r,rt<<1|1));
return maxx;
}
int main(){
int N,M;
while(scanf("%d%d",&N,&M)!=EOF){
build(1,N,1);
char s[5];
int a,m;
for(int i=0;i<M;i++){
scanf("%s%d%d",s,&a,&m);
//cout<<s[0];
if(s[0]==‘Q‘) printf("%d\n",query(a,m,1,N,1));
if(s[0]==‘U‘) update(1,N,1,a,m);
}
}
return 0;
}
标签:clu oid lazy UI 清除 区间 turn upd std
原文地址:http://www.cnblogs.com/lintanxi/p/6783811.html