记录编号 272331 评测结果 AAAAAAAAAA
题目名称 [HAOI 2008]排名系统 最终得分 100
用户昵称 GravatarTenderRun 是否通过 通过
代码语言 C++ 运行时间 2.550 s
提交时间 2016-06-16 20:17:44 内存使用 6.46 MiB
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
const int maxn=300010;
const int INF=2147483647;
map<string,int>ID;
char c;
string name[maxn],str;
int rt,cnt,fa[maxn],ch[maxn][2],sz[maxn],key[maxn];

void Push_up(int x){
	sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
}

void Rotate(int x){
	int y=fa[x],g=fa[y],c=ch[y][1]==x;
	ch[y][c]=ch[x][c^1];
	if(ch[x][c^1])fa[ch[x][c^1]]=y;
	ch[x][c^1]=y;fa[y]=x;fa[x]=g;
	if(g)ch[g][ch[g][1]==y]=x;
	Push_up(y);
}

void Splay(int x,int g=0){
	for(int y;(y=fa[x])!=g;Rotate(x))
		if(fa[y]!=g)Rotate((ch[fa[y]][1]==y)==(ch[y][1]==x)?y:x);
	Push_up(x);
	if(!g)rt=x;
}

void Get_LR(int x,int &l,int &r){
	Splay(x);
	l=ch[x][0];r=ch[x][1];
	while(ch[l][1])l=ch[l][1];
	while(ch[r][0])r=ch[r][0];
}

void Delete(int x){
	int l,r;
	Get_LR(x,l,r);
	Splay(l);Splay(r,rt);
	ch[ch[rt][1]][0]=0;
	Push_up(ch[rt][1]);
	Push_up(rt);
}

void Insert(int &p,int f,int id,int x){
	if(!p){
		key[p=id]=x;
		fa[p]=f;
		sz[p]=1;
		Splay(p);
		return;
	}
	sz[p]+=1;
	Insert(ch[p][key[p]<x],p,id,x);
}

int Get_ID(int k){
	int p=rt;
	while(true){
		if(sz[ch[p][0]]+1==k)break;
		if(sz[ch[p][0]]+1>k)p=ch[p][0];
		else k-=sz[ch[p][0]]+1,p=ch[p][1];
	}
	return p;
}

void Print(int p){
	if(!p)return;
	Print(ch[p][1]);
	cout<<name[p]<<" ";
	Print(ch[p][0]);
}

void Init(){
	Insert(rt,0,1,-INF);
	Insert(rt,0,2,INF);cnt=2;
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("rank.in","r",stdin);
	freopen("rank.out","w",stdout);
#endif
	Init();
	int Q,d,tot=0;
	scanf("%d",&Q);
	while(Q--){
		do c=getchar();
		while(c!='+'&&c!='?');
	
		if(c=='+'){	
			cin>>str;
			scanf("%d",&d);
			if(ID[str]){
				Delete(ID[str]);
				Insert(rt,0,ID[str],d);
			}
			else{
				ID[str]=++cnt;tot+=1;name[cnt]=str;
				Insert(rt,0,ID[str],d);
			}
		}
		else{
			cin>>str;
			if(str[0]<='9'&&str[0]>='0'){
				int l,r=0;
				for(int i=0;str[i];i+=1)
					r=r*10+(str[i]-'0');
				r=tot-r+1;l=max(r-9,1);
				Splay(Get_ID(l));Splay(Get_ID(r+2),rt);
				Print(ch[ch[rt][1]][0]);
				printf("\n");
			}
			else{
				Splay(Get_ID(1));Splay(ID[str],rt);
				printf("%d\n",tot-sz[ch[ch[rt][1]][0]]);
			}	
		}
	}
	return 0;
}