标签:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<cstdlib> 6 #include<ctime> 7 #include<algorithm> 8 using namespace std; 9 const int INF=985003; 10 int n,root,tot,len,head[INF+10]; 11 struct node1{int v,next,time;char ch[10];}hash[250010]; 12 struct node2{int v,time,fix,size,l,r; char ch[10];}tr[250010]; 13 void updata(int p) {tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;} 14 void lturn(int &p) {int c=tr[p].r; tr[p].r=tr[c].l; tr[c].l=p; tr[c].size=tr[p].size; updata(p); p=c;} 15 void rturn(int &p) {int c=tr[p].l; tr[p].l=tr[c].r; tr[c].r=p; tr[c].size=tr[p].size; updata(p); p=c;} 16 bool cmp(char a[],char b[]) {for(int i=1;i<max(strlen(a),strlen(b));i++) if(a[i]!=b[i]) return 0;return 1;} 17 int Hash(char ch[]) {int s=0; for(int i=1;i<strlen(ch);i++) {s*=27; s+=ch[i]-‘A‘+1; s%=INF;} return s;} 18 void insert(int &p,int v,int time,char ch[]) 19 { 20 if(!p) 21 { 22 p=++len; tr[p].size=1; tr[p].v=v; tr[p].time=time; tr[p].fix=rand(); 23 memcpy(tr[p].ch,ch,strlen(ch)); return; 24 } 25 tr[p].size++; 26 if(v<=tr[p].v) {insert(tr[p].l,v,time,ch); if(tr[p].fix>tr[tr[p].l].fix) rturn(p);} 27 else {insert(tr[p].r,v,time,ch); if(tr[p].fix>tr[tr[p].r].fix) lturn(p);} 28 } 29 void del(int &p,int v,int time) 30 { 31 if(v==tr[p].v) 32 { 33 if(time==tr[p].time) 34 { 35 if(tr[p].l*tr[p].r==0) p=tr[p].l+tr[p].r; 36 else if(tr[tr[p].l].fix<tr[tr[p].r].fix) {rturn(p); del(p,v,time);} 37 else {lturn(p); del(p,v,time);} 38 } 39 else if(time>tr[p].time) {tr[p].size--; del(tr[p].l,v,time);} 40 else {tr[p].size--; del(tr[p].r,v,time);} 41 } 42 else if(v<tr[p].v) {tr[p].size--; del(tr[p].l,v,time);} 43 else {tr[p].size--; del(tr[p].r,v,time);} 44 } 45 void work(char ch[],int x,int time) 46 { 47 int k=Hash(ch); int i=head[k]; 48 while(i) 49 { 50 if(cmp(hash[i].ch,ch)) 51 { 52 del(root,hash[i].v,hash[i].time); 53 hash[i].time=time; hash[i].v=x; 54 insert(root,x,time,ch); 55 return; 56 } 57 i=hash[i].next; 58 } 59 tot++; 60 hash[tot].time=time; hash[tot].v=x; 61 hash[tot].next=head[k]; head[k]=tot; 62 memcpy(hash[tot].ch,ch,strlen(ch)); 63 insert(root,x,time,ch); 64 } 65 int get(char ch[]) 66 { 67 int k=Hash(ch);int i=head[k]; 68 while(i) 69 { 70 if(cmp(hash[i].ch,ch))return i; 71 i=hash[i].next; 72 } 73 } 74 int rank(int p,int v,int time) 75 { 76 if(p==0) return 0; 77 if(tr[p].v==v) 78 { 79 if(tr[p].time==time) return tr[tr[p].r].size+1; 80 else if(time<tr[p].time) return rank(tr[p].r,v,time); 81 else return tr[tr[p].r].size+1+rank(tr[p].l,v,time); 82 } 83 else if(v>tr[p].v) return rank(tr[p].r,v,time); 84 else return tr[tr[p].r].size+1+rank(tr[p].l,v,time); 85 } 86 void ask1(char ch[]) 87 { 88 int t=get(ch); 89 printf("%d\n",rank(root,hash[t].v,hash[t].time)); 90 } 91 int index(int k,int x) 92 { 93 if(tr[tr[k].r].size+1==x)return k; 94 else if(x<=tr[tr[k].r].size)return index(tr[k].r,x); 95 else return index(tr[k].l,x-tr[tr[k].r].size-1); 96 } 97 void ask2(char ch[]) 98 { 99 int s=0; 100 for(int i=1;i<strlen(ch);i++){s*=10;s+=ch[i]-‘0‘;} 101 for(int i=s;i<=tot&&i<=s+9;i++) 102 { 103 printf("%s",tr[index(root,i)].ch+1); 104 if(i<tot&&i<s+9)printf(" "); 105 } 106 printf("\n"); 107 } 108 int main() 109 { 110 freopen("cin.in","r",stdin); 111 freopen("cout.out","w",stdout); 112 scanf("%d",&n); char ch[11]; int x; 113 for(int i=1;i<=n;i++) 114 { 115 scanf("%s",ch); 116 if(ch[0]==‘+‘) {scanf("%d",&x); work(ch,x,i);} 117 else if(ch[1]>=‘A‘&&ch[1]<=‘Z‘) ask1(ch); 118 else ask2(ch); 119 } 120 return 0; 121 }
标签:
原文地址:http://www.cnblogs.com/chty/p/5829408.html