题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1754
#include <iostream>
#include <cstdio>
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int MAXN = 200010;
int MaxNum[MAXN<<2];
int MAX(int a, int b)
{
return a > b ? a : b;
}
void Push_Up(int rt)
{
MaxNum[rt] = MAX(MaxNum[rt<<1], MaxNum[rt<<1|1]);
}
void Build_Tree(int l, int r, int rt)
{
if(l == r)
{
scanf("%d", &MaxNum[rt]);
return ;
}
int m = (l+r)>>1;
Build_Tree(lson);
Build_Tree(rson);
Push_Up(rt);
}
void UFSet(int pos, int data, int l, int r, int rt)
{
if(l == r)
{
MaxNum[rt] = data;
return ;
}
int m = (l+r)>>1;
if(pos <= m)
UFSet(pos, data, lson);
else
UFSet(pos, data, rson);
Push_Up(rt);
}
int Query_Tree(int L, int R, int l, int r, int rt)
{
if(L <= l && R >= r)
return MaxNum[rt];
int m = (l+r) >> 1;
int res = 0;
if(L <= m)
res = MAX(res, Query_Tree(L, R, lson));
if(R > m)
res = MAX(res, Query_Tree(L, R, rson));
return res;
}
int main()
{
int n, oper;
char c[2];
int a, b;
while(~scanf("%d %d", &n, &oper))
{
Build_Tree(1, n, 1);
while(oper--)
{
scanf("%s%d %d", c, &a, &b);
if(c[0] == 'Q')
printf("%d\n", Query_Tree(a, b, 1, n, 1));
else
UFSet(a, b, 1, n, 1);
}
}
return 0;
}