#include<iostream>
using namespace std;
const int N=2e5+10;
int n,m,w[N];
struct node{
int l;
int r;
int maxx;
}tr[N*4];
void pushup(int u)
{
tr[u].maxx=max(tr[u<<1].maxx,tr[u<<1|1].maxx);
}
void build(int u,int l,int r)
{
if(l==r)tr[u]={l,r,w[r]};
else
{
tr[u]={l,r};
int mid=l+r>>1;
build(u<<1,l,mid),build(u<<1|1,mid+1,r);
pushup(u);
}
}
int query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r)return tr[u].maxx;
else
{
int ans=-0x7fffffff;
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid)ans=max(ans,query(u<<1,l,r));
if(r>mid)ans=max(ans,query(u<<1|1,l,r));
return ans;
}
}
void modify(int u,int x,int v)
{
if(tr[u].l==tr[u].r)
{
tr[u].maxx+=v;
}
else
{
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid)modify(u<<1,x,v);
else modify(u<<1|1,x,v);
pushup(u);
}
}
int main()
{
char op;
int a,b;
cin>>n>>m;
for(int i=1;i<=n;i++)scanf("%d",&w[i]);
build(1,1,n);
while(m--)
{
cin>>op;
if(op=='Q')
{
cin>>a>>b;
cout<<query(1,a,b)<<endl;
}
else
{
cin>>a>>b;
if(b-w[a]>0)
{
int ans=b-w[a];
modify(1,a,ans);
}
else continue;
}
}
return 0;
}
不知道哪里错了