题目链接
foj有点老了,不资瓷万能头,不能用unordered_map,用map会爆内存
线段树维护左边界,右边界,和答案。
#include<map>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#define ok (l==r)
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r)>>1
#define lson ls,l,m
#define rson rs,m+1,r
typedef long long LL;
using namespace std;
const int maxn=500005;
int pos[500050];
struct node{
int is;
int lmx,rmx;
int ans;
}tree[maxn*3];
void clamp(int &a){
a=a<=0?0:1;
}
void pushup(int rt){
tree[rt].lmx=tree[rt].rmx=tree[rt].ans=0;
if(tree[ls].ans){
tree[rt].ans=tree[ls].ans;
if(tree[rs].ans){
tree[rt].ans=min(tree[rt].ans,tree[rs].ans);
}
}else if(tree[rs].ans){
tree[rt].ans=tree[rs].ans;
}
if(tree[ls].lmx){
tree[rt].lmx=tree[ls].lmx;
tree[rt].rmx=tree[ls].rmx;
}
if(tree[rs].rmx){
tree[rt].rmx=tree[rs].rmx;
if(!tree[ls].lmx)tree[rt].lmx=tree[rs].lmx;
}
if(!tree[rt].ans)tree[rt].ans=tree[rt].rmx-tree[rt].lmx;
else if(tree[ls].rmx&&tree[rs].lmx){
tree[rt].ans=min(tree[rt].ans,tree[rs].lmx-tree[ls].rmx);
}
}
void update(int rt,int l,int r,int po,int add){
//printf("%d %d %d\n",l,r,po);
if(ok){
tree[rt].is+=add;
clamp(tree[rt].is);
if(!tree[rt].is)tree[rt].lmx=tree[rt].rmx=tree[rt].ans=0;
else tree[rt].lmx=tree[rt].rmx=pos[l],tree[rt].ans=0;
return ;
}
int m=mid;
if(po<=m)update(lson,po,add);
else update(rson,po,add);
pushup(rt);
}
struct OP{
int type;
int num;
}op[500050];
char str[5];
int cnt;
void init(){
memset(tree,0,sizeof tree);
cnt=0;
}
int main(){
int t;
while(~scanf("%d",&t)){
init();
for(int i=1;i<=t;i++){
scanf("%s",str);
if(str[0]=='a'){
op[i].type=1;
scanf("%d",&op[i].num);
pos[++cnt]=op[i].num;
}
if(str[0]=='d'){
op[i].type=-1;
scanf("%d",&op[i].num);
pos[++cnt]=op[i].num;
}
if(str[0]=='m'){
op[i].type=0;
}
}
sort(pos+1,pos+1+cnt);
cnt=unique(pos+1,pos+1+cnt)-pos-1;
for(int i=1;i<=t;i++){
if(!op[i].type)printf("%d\n",tree[1].ans);
else {
int k=lower_bound(pos+1,pos+cnt+1,op[i].num)-pos;
update(1,1,cnt,k,op[i].type);
}
}
}
return 0;
}