http://acm.hdu.edu.cn/showproblem.php?pid=1166
cdq入门
using namespace std;
struct node
{
int tp;
int pos;
int val;
};
node order[200010],tmp[200010];
int ans[40010];
int n,tot;
void cdq(int l,int r)
{
int cnt,m,p,q,sum,i;
if(l==r) return;
cnt=l,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)
{
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];
}
int main()
{
int t,cas,i,val,a,b,cnt;
char op[10];
scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
scanf("%d",&n);
tot=0;
for(i=1;i<=n;i++)
{
scanf("%d",&val);
tot++;
order[tot].tp=1,order[tot].pos=i,order[tot].val=val;
}
cnt=0;
while(1)
{
scanf("%s",op);
if(op[0]=='A')
{
scanf("%d%d",&a,&b);
tot++;
order[tot].tp=1,order[tot].pos=a,order[tot].val=b;
}
else if(op[0]=='S')
{
scanf("%d%d",&a,&b);
tot++;
order[tot].tp=1,order[tot].pos=a,order[tot].val=-b;
}
else if(op[0]=='Q')
{
scanf("%d%d",&a,&b);
tot++,cnt++;
order[tot].tp=2,order[tot].pos=a-1,order[tot].val=cnt;
tot++;
order[tot].tp=3,order[tot].pos=b,order[tot].val=cnt;
}
else break;
}
memset(ans,0,sizeof(ans));
cdq(1,tot);
printf("Case %d:\n",cas);
for(i=1;i<=cnt;i++) printf("%d\n",ans[i]);
}
return 0;
}