线段树模板题,求区间最大值。
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 200005;
const int inf = 0;
int seg[4*N],M;
int max(int a,int b) { return a>b?a:b; }
void segtree_build(int n){
int lv,i;
for(M=1,lv=0;M<=n;M<<=1,lv++);
seg[M]=inf;
for(i=M+1;i<=M+n;i++)
scanf("%d",&seg[i]);
for(;i<(M<<1);i++) seg[i]=inf;
for(--lv;lv>=0;lv--)
for(i=(1<<lv);i<(1<<lv+1);i++)
seg[i]=max(seg[i<<1],seg[i<<1^1]);
return ;
}
int segtree_query(int l,int r){
int ans=0;
for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1){
if(!(l&1)) ans=max(ans,seg[l^1]);
if(r&1) ans=max(ans,seg[r^1]);
}
return ans;
}
void segtree_insert(int p,int v){
p+=M;
seg[p]=v;
for(p>>=1;p;p>>=1)
seg[p]=max(seg[p<<1],seg[p<<1^1]);
return ;
}
int main(){
//freopen("in.in","r",stdin);
int n,m,a,b;
char s[5];
while(~scanf("%d%d",&n,&m)){
segtree_build(n);
while(m--){
scanf("%s%d%d",s,&a,&b);
if(s[0]=='Q')
printf("%d\n",segtree_query(a,b));
else if(s[0]=='U')
segtree_insert(a,b);
}
}
return 0;
}