区间更新,区间求最大值
#include <iostream>
#include <algorithm>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int MAXN=222222;
int stree[MAXN<<2];
void build(int l,int r,int rt)
{
if(l==r)
{
scanf("%d",&stree[rt]);
return;
}
int mid=(l+r)>>1;
build(lson);
build(rson);
stree[rt]=max(stree[rt<<1],stree[rt<<1|1]);
}
int query(int l1,int r1,int l,int r,int rt)
{
if(l1<=l&&r<=r1)
return stree[rt];
int ans=0;
int mid=(l+r)>>1;
if(l1<=mid) ans=max(ans,query(l1,r1,lson));
if(r1>mid) ans=max(ans,query(l1,r1,rson));
return ans;
}
void update(int a,int b,int l,int r,int rt)
{
if(l==r)
{
stree[rt]=b;
return;
}
int mid=(l+r)>>1;
if(a<=mid) update(a,b,lson);
else update(a,b,rson);
stree[rt]=max(stree[rt<<1],stree[rt<<1|1]);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
build(1,n,1);
for(int i=0;i<m;i++)
{
char c[2];
int a,b;
scanf("%s%d%d",c,&a,&b);
if(c[0]=='Q') printf("%d\n",query(a,b,1,n,1));
else if(c[0]=='U') update(a,b,1,n,1);
}
}
return 0;
}