Coder

来源:互联网 发布:安卓虚拟内存软件 编辑:程序博客网 时间:2024/04/27 18:28
//sum[id]存的是[l,r]区间中id=i%5的值#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;typedef __int64 lld;const int maxn=100005;struct Seg{int l,r;int num;lld sum[5];}tree[maxn<<2];char ch[maxn][5];int n;int cnt;int x[maxn];int val[maxn];int LL(int x){return (x<<1);}int RR(int x){return (x<<1)|1;}void build(int l,int r,int k){tree[k].l=l;tree[k].r=r;tree[k].num=0;for(int i=0;i<5;i++)tree[k].sum[i]=0;if(l==r)return ;int mid=(l+r)>>1;build(l,mid,LL(k));build(mid+1,r,RR(k));}void push_up(int k){tree[k].num=tree[LL(k)].num+tree[RR(k)].num;for(int i=0;i<5;i++){tree[k].sum[i]=tree[LL(k)].sum[i]+tree[RR(k)].sum[(i-tree[LL(k)].num%5+5)%5];}}void update(int id,int k,int flag){if(id==tree[k].l && id==tree[k].r){tree[k].sum[1]+=x[id]*flag;tree[k].num+=flag;return ;}int mid=(tree[k].l+tree[k].r)>>1;if(id<=mid)update(id,LL(k),flag);if(id>mid)update(id,RR(k),flag);push_up(k);}int main(){int pos;int i,j,k;while(scanf("%d",&n)!=EOF){cnt=0;for(i=0;i<n;i++){scanf("%s",ch[i]);if(ch[i][0]=='a'){scanf("%d",&val[i]);x[cnt++]=val[i];}else if(ch[i][0]=='d'){scanf("%d",&val[i]);}}sort(x,x+cnt);cnt=unique(x,x+cnt)-x;build(0,cnt,1);for(i=0;i<n;i++){if(ch[i][0]=='a'){pos=lower_bound(x,x+cnt,val[i])-x;update(pos,1,1);}else if(ch[i][0]=='d'){pos=lower_bound(x,x+cnt,val[i])-x;update(pos,1,-1);}else{printf("%I64d\n",tree[1].sum[3]);}}}return 0;}/*11add 1sumadd 2sumadd 3sumsumsumdel 3add 4sum 9add 1add 2add 3sumsumsumdel 3add 4sum 8add 1add 2add 3sumdel 3sumadd 4sum  */