记录编号 173108 评测结果 AAAAAAAAAA
题目名称 [NOI 2004]郁闷的出纳员 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 1.068 s
提交时间 2015-07-27 21:51:59 内存使用 0.31 MiB
显示代码纯文本
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <vector>

struct Node{
	Node *left,*right;
	int val,fix,s;
	Node(){
		left=NULL;right=NULL;
		return;
	}
};

std::vector<int> rd;

Node *root;

int Min,n,k,num,Sum,c;

char inp[5];

void Update(Node *&p){
    if(!p){
        return;
    }
	p->s=1;
	if(p->left){
		p->s+=p->left->s;
	}
	if(p->right){
		p->s+=p->right->s;
	}
	return;
}

void Rturn(Node *&a){
	Node *b=a->left;
	a->left=b->right;
	b->right=a;
	a=b;
	Update(b->right);
    return;
}

void Lturn(Node *&a){
	Node *b=a->right;
	a->right=b->left;
	b->left=a;
	a=b;
	Update(b->left);
	return;
}

void Del(Node *&p){
    if(k==p->val){
 	  if(!p->left||!p->right){
    		Node *t=p;
    		if(p->left){
    			p=p->left;
    		}
    		else{
    			p=p->right;
    		}
    		delete t;
    	}
    	else{
    		if(p->left->fix < p->right->fix){
    			Rturn(p);
    			Del(p->right);
    		}
    		else{
    			Lturn(p);
    			Del(p->left);
    		}
    	}       
    }
    else{
        if(p->val>=k){
            Del(p->left);
        }
        else{
            Del(p->right);
        }
    }
    Update(p);
	return;
}

void dfs(Node *&p){
	if(!p){
		return;
	}
	p->val+=k;
	dfs(p->left);
	dfs(p->right);
	if(p->val<Min){
		rd.push_back(p->val);num++;return;
	}
	return;
}

void Insert(Node *&p){
	if(!p){
		p=new Node;
		p->val=k;
		p->fix=rand();
		p->s=1;
		return;
	}
	else if(k<=p->val){
		Insert(p->left);
		if(p->left->fix < p->fix){
			Rturn(p);
		}
	}
	else{
		Insert(p->right);
		if(p->right->fix < p->fix){
			Lturn(p);
		}
	}
    Update(p);
	return;
}

void Find(Node *p,int r){
	int Rank=1;
	if(p->left){
		Rank+=p->left->s;
	}
	if(Rank==r){
		printf("%d",p->val);
		return;
	}
	else if(Rank<r){
		Find(p->right,r-Rank);
	}
	else{
		Find(p->left,r);
	}
	return;
}

int main(){
	freopen("cashier.in","r",stdin);
	freopen("cashier.out","w",stdout);
	srand((unsigned)time(NULL));
	scanf("%d%d",&n,&Min);
	for(int i=1;i<=n;i++){
		scanf("%s%d",inp,&k);
		if(inp[0]=='I'){
			Sum++;
			if(k<Min){
				num++;c++;
			}
			else{
				Insert(root);
			}
		}
		else if(inp[0]=='A'){
			dfs(root);
		}
		else if(inp[0]=='S'){
            k=-k;
			dfs(root);
			int sz=rd.size();
			for(int i=0;i<sz;i++){
                k=rd[i];Del(root);
            }rd.clear();
		}
		else{
			if(k>Sum-num){
				puts("-1");
			}
			else{
				k=Sum-num-k+1;
				Find(root,k);
			}
		}
	}
	printf("%d",num-c);
	return 0;
}