#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=2e5+5;
int n,m,a[maxn];
vector<int> v;
int cnt,root[maxn];
int getid(int x)
{
return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
struct aaa{
int l,r,sum;
}t[maxn*40];
void insert(int l,int r,int pre,int &now,int p)
{
t[++cnt]=t[pre];
now=cnt;
t[now].sum++;
if(l==r)
return;
int mid=(l+r)>>1;
if(p<=mid)
insert(l,mid,t[pre].l,t[now].l,p);
else
insert(mid+1,r,t[pre].r,t[now].r,p);
}
int query(int l,int r,int L,int R,int k)
{
if(l==r)
return l;
int mid=(l+r)>>1;
int tmp=t[t[R].l].sum-t[t[L].l].sum;
if(k<=tmp)
return query(l,mid,t[L].l,t[R].l,k);
else
return query(mid+1,r,t[L].r,t[R].r,k-tmp);
}
char cc[1000000];
int cao;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char c,c1;
int x;
cin>>c;
if(c=='T')
{
cin>>c1;
cao++;
insert(1,26,root[cao-1],root[cao],c1-'a');
}
if(c=='U')
{
cin>>x;
cao++;
cnt++;
root[cao]=root[cao-x-1];
t[cnt].l=t[root[cao-x-1]].l;
t[cnt].r=t[root[cao-x-1]].r;
t[cnt].sum=t[root[cao-x-1]].sum;
cc[cao]=cc[cao-x-1];
}
if(c=='Q')
{
cin>>x;
printf("%c\n",query(1,26,root[0],root[cao],x)+'a');
}
}
return 0;
}