很水的线段树,单点更新(RMQ更快)
#include<stdio.h>
#include<string.h>
int n;
int in[200010];
struct Tree{
int s;
int t;
int max;
}tree[540000];
int max(int a,int b){
return a>b?a:b;
}
void build(int s,int t,int id){
tree[id].s=s;
tree[id].t=t;
if(s==t){
tree[id].max=in[s];
return ;
}
int mid=(s+t)>>1;
build(s,mid,id*2);
build(mid+1,t,id*2+1);
tree[id].max=max(tree[id*2].max,tree[id*2+1].max);
}
void update(int id,int i,int tem){
if(tree[id].s==tree[id].t && tree[id].s==i){
tree[id].max=tem;
return;
}
int mid=(tree[id].s+tree[id].t)>>1;
if(mid>=i)
update(id*2,i,tem);
else
update(id*2+1,i,tem);
tree[id].max=max(tree[id*2].max,tree[id*2+1].max);
}
int query(int id,int s,int t){
if(tree[id].s==tree[id].t)
return tree[id].max;
if(tree[id].s==s && t==tree[id].t)
return tree[id].max;
int mid=(tree[id].s+tree[id].t)>>1;
if(mid>=t)
return query(id*2,s,t);
else if(s>mid)
return query(id*2+1,s,t);
else
return max(query(id*2,s,mid),query(id*2+1,mid+1,t));
}
int main(){
int T,t,i,tem,mm;
while(scanf("%d %d",&n,&mm)!=EOF){
for(i=1;i<=n;i++){
scanf("%d",&in[i]);
}
build(1,n,1); //这种初始化建树比较快
char m[10];
for(i=1;i<=mm;i++){
scanf("%s",m);
if(m[0]=='U'){
int p,q;
scanf("%d %d",&p,&q);
update(1,p,q);
}
if(m[0]=='Q'){
int p,q;
scanf("%d %d",&p,&q);
printf("%d\n",query(1,p,q));
}
}
}
}