CDQ分治求前缀和

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int n,a_tot,q_tot,ans[N];
char s[];
struct query
{
int id,v,op;
bool operator < (const query &rhs)const
{
if(id==rhs.id) return op<rhs.op;
return id<rhs.id;
}
}query[N],tmp[N];
void init()
{
a_tot=; q_tot=;
memset(ans,,sizeof(ans));
}
void cdq(int l,int r)
{
if(l==r) return;
int m=(l+r)>>;
cdq(l,m); cdq(m+,r);
int p=l,q=m+,tot=,sum=;
while(p<=m && q<=r)
{
if(query[p]<query[q])
{
if(query[p].op==) sum+=query[p].v;
tmp[tot++]=query[p++];
}
else
{
if(query[q].op==) ans[query[q].v]+=sum;
else if(query[q].op==) ans[query[q].v]-=sum;
tmp[tot++]=query[q++];
}
}
while(p<=m) tmp[tot++]=query[p++];
while(q<=r)
{
if(query[q].op==) ans[query[q].v]+=sum;
else if(query[q].op==) ans[query[q].v]-=sum;
tmp[tot++]=query[q++];
}
for(int i=;i<tot;i++) query[i+l]=tmp[i];
}
int main()
{
int T; scanf("%d",&T);
for(int Case=;Case<=T;Case++)
{
init();
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int g; scanf("%d",&g);
query[a_tot].op=;
query[a_tot].id=i;
query[a_tot++].v=g;
}
while(scanf("%s",&s)!=EOF)
{
if(s[]=='E') break;
if(s[]=='S' || s[]=='A')
{
int flag=,x,v;
if(s[]=='S') flag=-;
scanf("%d%d",&x,&v);
query[a_tot].id=x;
query[a_tot].v=flag*v;
query[a_tot++].op=;
}
else
{
int l,r; scanf("%d%d",&l,&r);
query[a_tot].id=l-;
query[a_tot].op=;
query[a_tot++].v=q_tot;
query[a_tot].id=r;
query[a_tot].op=;
query[a_tot++].v=q_tot;
q_tot++;
}
}
cdq(,a_tot-);
printf("Case %d:\n",Case);
for(int i=;i<q_tot;i++) printf("%d\n",ans[i]);
}
return ;
}
上一篇:node.js 发送http 请求


下一篇:Andriod Studio adb.exe,start-server' failed -- run manually if necessary 解决