#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define lc t[x].l
#define rc t[x].r
const int N=250005,MOD=985003;
int read(){
    char c=getchar();int x=0,f=1;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘; c=getchar();}
    return x*f;
}
int v,tm;
char s[15];
struct node{
    int l,r,v,t,size,rnd;
    char s[15];
}t[N];
int sz,root;
inline void update(int x){t[x].size=t[lc].size+t[rc].size+1;}
inline void rturn(int &x){
    int c=lc;lc=t[c].r;t[c].r=x;
    t[c].size=t[x].size;update(x);x=c;
}
inline void lturn(int &x){
    int c=rc;rc=t[c].l;t[c].l=x;
    t[c].size=t[x].size;update(x);x=c;
}
inline void ins(int &x,int v,int tm,char s[]){
    if(x==0){
        sz++;x=sz;
        t[x].l=t[x].r=0;t[x].size=1;
        t[x].v=v;t[x].rnd=rand();t[x].t=tm;
        memcpy(t[x].s,s,strlen(s));
        return;
    }
    t[x].size++;
    if(v<=t[x].v){
        ins(lc,v,tm,s);
        if(t[lc].rnd<t[x].rnd) rturn(x);
    }else{
        ins(rc,v,tm,s);
        if(t[rc].rnd<t[x].rnd) lturn(x);
    }
}
inline void del(int &x,int v,int tm){
    if(x==0) return;
    if(t[x].v==v){
        if(t[x].t==tm){
            if(lc*rc==0) x=lc+rc;
            else if(t[lc].rnd<t[rc].rnd) rturn(x),del(x,v,tm);
            else lturn(x),del(x,v,tm);
        }else{
            t[x].size--;
            if(tm>t[x].t) del(lc,v,tm);
            else del(rc,v,tm);
        }
    }else{
        t[x].size--;
        if(v<t[x].v) del(lc,v,tm);
        else del(rc,v,tm);
    }
}
int rnk(int x,int v,int tm){
    if(x==0) return 0;
    if(t[x].v==v){
        if(tm==t[x].t) return t[lc].size+1;
        else if(tm>t[x].t) return rnk(lc,v,tm);
        else return t[lc].size+1+rnk(rc,v,tm);
    }
    else if(v<t[x].v) return rnk(lc,v,tm);
    else return t[lc].size+1+rnk(rc,v,tm);
}
int kth(int x,int k){
    if(x==0) return 0;
    if(k<=t[lc].size) return kth(lc,k);
    else if(k>t[lc].size+1) return kth(rc,k-t[lc].size-1);
    else return x;
}
struct data{
    int v,tm,ne;
    char s[15];
}mp[MOD+5];
int h[MOD+5],cnt;
int hsh(char s[]){
    int x=0,len=strlen(s+1);
    for(int i=1;i<=len;i++) x=(x*27+s[i]-‘A‘+1)%MOD;
    return x;
}
inline bool equ(char s1[],char s2[]){
    int l1=strlen(s1),l2=strlen(s2);
    if(l1!=l2) return false;
    for(int i=1;i<=l1;i++) if(s1[i]!=s2[i]) return false;
    return true;
}
void Insert(char s[],int v,int tm){
    int k=hsh(s);
    for(int i=h[k];i;i=mp[i].ne){
        if(equ(s,mp[i].s)){
            del(root,mp[i].v,mp[i].tm);
            mp[i].v=v;mp[i].tm=tm;
            ins(root,v,tm,s);
            return;
        }
    }
    cnt++;
    mp[cnt].v=v;mp[cnt].tm=tm;
    memcpy(mp[cnt].s,s,strlen(s));
    mp[cnt].ne=h[k];h[k]=cnt;
    ins(root,v,tm,s);
}
void Rank(char s[]){
    int k=hsh(s),i;
    for(i=h[k];i;i=mp[i].ne)
        if(equ(s,mp[i].s)) break;
    printf("%d\n",cnt+1-rnk(root,mp[i].v,mp[i].tm));
}
void Kth(char s[]){
    int k=0,len=strlen(s+1);
    for(int i=1;i<=len;i++) k=k*10+s[i]-‘0‘;
    //printf("Kth %d %s %d\n",k,s,len);
    for(int i=k;i<=cnt&&i<=k+9;i++){
        printf("%s",t[kth(root,cnt+1-i)].s+1);
        if(i<cnt&&i<k+9) putchar(‘ ‘);
    }
    putchar(‘\n‘);
}
int main(){
    int T=read();
    for(int i=1;i<=T;i++){
        scanf("%s",s);
        if(s[0]==‘+‘){
            v=read();
            Insert(s,v,i);
        }else{
            if(s[1]>=‘0‘&&s[1]<=‘9‘) Kth(s);
            else Rank(s);
        }
    }
}