大意:
在给定区间修改某一点的值,然后查询某一个区间的和;
思路:
分块;
如果包含整区间的话,那就直接加上整个区间的值;否则暴力累加每一个点的值;
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+9;
int a[maxn];
long long sum[maxn];
int main()
{
int t;
scanf("%d",&t);
for(int ase=1;ase<=t;ase++)
{
memset(sum,0,sizeof sum);
int n;
scanf("%d",&n);
int block=sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i/block]+=a[i];
}
printf("Case %d:\n",ase);
char op[10];
int s,e;
while(1)
{
scanf("%s",op);
if(strcmp(op,"End")==0) break;
scanf("%d%d",&s,&e);
if(op[0]=='A')
{
int t=s/block;
sum[t]+=e;
a[s]+=e;
}
else if(op[0]=='S')
{
int t=s/block;
sum[t]-=e;
a[s]-=e;
}
else
{
long long ans=0;
for(int i=0,l=1,r=block-1;i<n/block+1;i++,l=i*block,r+=block)
{
int L=max(l,s);
int R=min(r,e);
if(L>R) continue;
else if(L==l&&r==R) ans+=sum[i];
else
{
for(int j=L;j<=R;j++)
ans+=a[j];
}
}
cout<<ans<<endl;
}
}
}
return 0;
}