一道经典线段树入门题:query: 区间最大,Update: 单点更新;
#include<cstdio>
#define M 220000
struct node{
int l,r;
int val;
}tree[M*4];
inline int max(int a,int b){ //为了提高运行速度,加内置函数,另外,除法用移位代替。
return a>b?a:b; //乘法用加法代替。
}
void build(int l,int r,int d){
tree[d].l=l;
tree[d].r=r;
tree[d].val=0;
if(l==r){
scanf("%d",&tree[d].val);
return;
}
int mid=(r+l)>>1;
build(l,mid,d<<1); //移位>加,减法> 乘,除法(运算速度)
build(mid+1,r,d+d+1);
tree[d].val=max(tree[d<<1].val,tree[d+d+1].val);
}
void Update(int p,int date,int d){
if(tree[d].r==p&&tree[d].l==p){
tree[d].val=date;
return ;
}
int mid=(tree[d].l+tree[d].r)>>1;
if(p<=mid) Update(p,date,d<<1);
if(p>mid) Update(p,date,d+d+1);
tree[d].val=max(tree[d<<1].val,tree[d+d+1].val);
}
int search(int l,int r,int d){
if(tree[d].l==l&&tree[d].r==r){
return tree[d].val;
}
int mid=(tree[d].l+tree[d].r)>>1;
if(r<=mid) return search(l,r,d<<1);
if(l>mid) return search(l,r,d+d+1); //严重注意d<<1+1是不行的啊,这相当于d*4。
if(l<=mid&&r>mid)
return max(search(l,mid,d<<1),search(mid+1,r,d+d+1));
}
int main(){
int i,n,m,l,r;
char op[2];
while(~scanf("%d %d",&n,&m)){
build(1,n,1);
while(m--){
scanf("%s %d %d",op,&l,&r);
if(op[0]=='Q') printf("%d\n",search(l,r,1));
else Update(l,r,1);
}
}
return 0;
}