#include<stdio.h>
#include<string>
#include<map>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<memory.h>
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
const int N = 2e5+7;
int a[N],d[N];
ll tree[N*2];
void build(int o,int l,int r)
{
if(l==r)
{
tree[o]=a[l];
d[o]=a[l];
return ;
}
int mid=(l+r)/2;
build(o*2,l,mid);
build(o*2+1,mid+1,r);
tree[o]=tree[o*2]+tree[o*2+1];
d[o]=max(d[o*2],d[o*2+1]);
}
void update(int o,int l,int r,int pos,int x)
{
if(l==r)
{
tree[o]=x;
d[o]=x;
return ;
}
int mid=(l+r)/2;
if(pos<=mid)
{
update(o*2,l,mid,pos,x);
}
else
{
update(o*2+1,mid+1,r,pos,x);
}
tree[o]=tree[o*2]+tree[o*2+1];
d[o]=max(d[o*2],d[o*2+1]);
}
int getmax(int o,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr)
{
return d[o];
}
int mid=(l+r)/2;
if(ql>=mid+1)
{
return getmax(o*2+1,mid+1,r,ql,qr);
}
else if(qr<=mid)
{
return getmax(o*2,l,mid,ql,qr);
}
else
{
return max(getmax(o*2,l,mid,ql,mid),getmax(o*2+1,mid+1,r,mid+1,qr));
}
}
ll query(int o,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr)
{
return tree[o];
}
int mid=(l+r)/2;
if(ql>=mid+1)
{
return query(o*2+1,mid+1,r,ql,qr);
}
else if(qr<=mid)
{
return query(o*2,l,mid,ql,qr);
}
else
{
return query(o*2,l,mid,ql,mid)+
query(o*2+1,mid+1,r,mid+1,qr);
}
}
int main()
{
int n,m,b,c;
char ch;
while(~scanf("%d %d",&n,&m))
{
memset(a,0,sizeof(a));
memset(d,0,sizeof(d));
memset(tree,0,sizeof(tree));
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
build(1,1,n);
for(int j=1; j<=m; j++)
{
getchar();
scanf("%c %d %d",&ch,&b,&c);
if(ch=='M')
{
printf("%d\n",getmax(1,1,n,b,c));
}
if(ch=='U')
{
update(1,1,n,b,c);
}
if(ch=='Q')
{
cout << query(1,1,n,b,c) << endl ;
}
}
}
return 0;
}
第一篇博客就水水了😄;