简单线段树<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct P
{
int max;
int l;
int r;
int val;
};
P ss[1000010];
int ma;
void build(int l,int r,int x)
{
ss[x].l=l;
ss[x].r=r;
if(l==r)
{
scanf("%d",&ss[x].val);
ss[x].max=ss[x].val;
return;
}
int mid;
mid=(l+r)/2;
build(l,mid,2*x);
build(mid+1,r,2*x+1);
ss[x].val=ss[2*x].val+ss[2*x+1].val;
ss[x].max=max(ss[2*x].max,ss[2*x+1].max);
}
void update(int l,int r,int x,int p,int v)
{
if(l==r)
{
ss[x].val=v;
ss[x].max=ss[x].val;
return;
}
int mid;
mid=(l+r)/2;
if(p<=mid)
update(l,mid,2*x,p,v);
else if(p>mid)
update(mid+1,r,2*x+1,p,v);
ss[x].val=ss[x*2].val+ss[x*2+1].val;
ss[x].max=max(ss[x*2].max,ss[x*2+1].max);
}
void query(int l,int r,int x,int ll,int rr)
{
if(ll<=l&&rr>=r)
{
if(ss[x].max>ma)
{
ma=ss[x].max;
return;
}
return;
}
int mid;
mid=(l+r)/2;
if(rr<=mid)
query(l,mid,2*x,ll,rr);
else if(mid<ll)
query(mid+1,r,2*x+1,ll,rr);
else
{
query(l,mid,2*x,ll,rr);
query(mid+1,r,2*x+1,ll,rr);
}
}
int main()
{
int n,m,i,j,k,l;
int x,y;
char op;
while(~scanf("%d%d",&n,&m))
{
build(1,n,1);
while(m--)
{
scanf("%s",&op);
scanf("%d%d",&x,&y);
if(op=='U')
{
update(1,n,1,x,y);
}
if(op=='Q')
{
ma=-11;
query(1,n,1,x,y);
printf("%d\n",ma);
}
}
}
return 0;
}