更新某点的回溯过程中,把max更新即可。
#include <stdio.h>
#include <algorithm>
using namespace std;
#define lson rt << 1
#define rson rt << 1 | 1
int maxn[200000 << 2];
void build(int l, int r, int rt)
{
if(l == r)
{
scanf("%d", &maxn[rt]);
return ;
}
int mid = (l + r) >> 1;
build(l, mid, lson);
build(mid + 1, r, rson);
maxn[rt] = max(maxn[lson], maxn[rson]);
}
int query(int l, int r, int rt, int L, int R)
{
if(L <= l && R >= r)
{
return maxn[rt];
}
int ans = 0;
int mid = (l + r) >> 1;
if(L <= mid) ans = query(l, mid, lson, L, R);
if(R > mid) ans = max(ans, query(mid + 1, r, rson, L, R));
return ans;
}
void update(int l, int r, int rt, int A, int B)
{
if(l == r)
{
maxn[rt] = B;
return ;
}
int mid = (l + r) >> 1;
if(A <= mid) update(l, mid, lson, A, B);
else update(mid + 1, r, rson, A, B);
maxn[rt] = max(maxn[lson], maxn[rson]);
}
int main()
{
int N, M, A, B;
char ch[10];
while(~scanf("%d %d", &N, &M))
{
build(1, N, 1);
for(int i = 0; i < M; i++)
{
scanf("%s %d %d", ch, &A, &B);
if(ch[0] == 'Q') printf("%d\n", query(1, N, 1, A, B));
else update(1, N, 1, A, B);
}
}
return 0;
}