//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;
}
/*
11
add 1
sum
add 2
sum
add 3
sum
sum
sum
del 3
add 4
sum
9
add 1
add 2
add 3
sum
sum
sum
del 3
add 4
sum
8
add 1
add 2
add 3
sum
del 3
sum
add 4
sum
*/
Coder
最新推荐文章于 2024-03-15 19:24:07 发布