http://acm.hdu.edu.cn/showproblem.php?pid=1166
cdq入门https://www.cnblogs.com/mlystdcall/p/6219421.html
#include <bits/stdc++.h>
using namespace std;
struct node
{
int tp;
int pos;
int val;
};
node order[150010],tmp[150010];
int ans[50010];
int n,q,num,len;
void cdq(int l,int r)
{
int cnt,i,m,p,q,sum;
if(l==r) return;
cnt=1,m=(l+r)/2,p=l,q=m+1,sum=0;
cdq(l,m);
cdq(m+1,r);
while(p<=m&&q<=r)
{
if(order[p].pos<order[q].pos||(order[p].pos==order[q].pos&&order[p].tp<order[q].tp))
{
if(order[p].tp==1) sum+=order[p].val;
tmp[cnt++]=order[p++];
}
else
{
if(order[q].tp==2) ans[order[q].val]-=sum;
else if(order[q].tp==3) ans[order[q].val]+=sum;
tmp[cnt++]=order[q++];
}
}
while(p<=m)
{
tmp[cnt++]=order[p++];
}
while(q<=r)
{
if(order[q].tp==2) ans[order[q].val]-=sum;
else if(order[q].tp==3) ans[order[q].val]+=sum;
tmp[cnt++]=order[q++];
}
for(i=l;i<=r;i++)
{
order[i]=tmp[i-l+1];
}
}
int main()
{
int t,cas,i,l,r,val;
char op[10];
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&val);
order[i].tp=1,order[i].pos=i,order[i].val=val;
}
num=n+1,len=1;
while(1)
{
scanf("%s",op);
if(op[0]=='A')
{
scanf("%d%d",&l,&r);
order[num].tp=1,order[num].pos=l,order[num].val=r;
num++;
}
else if(op[0]=='S')
{
scanf("%d%d",&l,&r);
order[num].tp=1,order[num].pos=l,order[num].val=-r;
num++;
}
else if(op[0]=='Q')
{
scanf("%d%d",&l,&r);
order[num].tp=2,order[num].pos=l-1,order[num].val=len;
num++;
order[num].tp=3,order[num].pos=r,order[num].val=len;
num++,len++;
}
else break;
}
memset(ans,0,sizeof(ans));
num--,len--;
cdq(1,num);
printf("Case %d:\n",cas);
for(i=1;i<=len;i++)
{
printf("%d\n",ans[i]);
}
}
return 0;
}