题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
#include <stdio.h>
int max(int a, int b)
{
return a>b ? a:b;
}
int data[200005];
typedef struct
{
int l,r,maxn;
} stu;
stu T[1000010];
void Build(int t,int l,int r)
{
T[t].l = l;
T[t].r = r;
int m = (l+r) / 2;
if(l == r)
{
T[t].maxn = data[l];
return ;
}
Build(2*t,l,m);
Build(2*t+1,m+1,r);
T[t].maxn = max(T[2*t].maxn,T[2*t+1].maxn);
}
int Query(int t,int x,int y)
{
int l = T[t].l;
int r = T[t].r;
if(l == x && r == y)
return T[t].maxn;
int m = (l+r)/2;
if(x <= m && y <= m)//如果给出区间全部属于左孩子
return Query(2*t,x,y);//查询左孩子
//否则,如果全都属于右孩子,查询右孩子
else if(x > m) return Query(2*t+1,x,y);
//否则,如果部分在左孩子,部分在右孩子
else return max(Query(2*t,x,m),Query(2*t+1,m+1,y));
}
void Updata(int t, int x, int der)
{
int l,r,m;
l = T[t].l;
r = T[t].r;
m = (l+r)/2;
if(l == r)
{
T[t].maxn = der;
return ;
}
if(x <= m)
Updata(2*t,x,der);//如果要修改的节点在左孩子区间内
else
Updata(2*t+1,x,der);//右孩子
//更新
T[t].maxn = max(T[2*t].maxn,T[2*t+1].maxn);
}
int main(){
int m,n,a,b;
int i;
char c;
while(scanf("%d%d",&n,&m) != EOF){
for(i = 1;i <= n;i++){
scanf("%d",&data[i]);
}
Build(1,1,n);
for(i = 0;i < m;i++){
getchar();
scanf("%c%d%d",&c,&a,&b);
if(c == 'Q'){
if(a > b){
int tem = a;
a = b;
b = tem;
}
printf("%d\n",Query(1,a,b));
}
else{
Updata(1,a,b);
}
}
}
return 0;
}