#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+15;
int n,root[MAXN],m,len[MAXN],cnt;
struct Segment_Tree{
int l,r;char v;
}tre[MAXN<<4];
inline int clone(int p){
tre[++cnt]=tre[p];return cnt;
}
int add(int l,int r,int p,int pos,char k){
p=clone(p);
if(l==r){
tre[p].v=k;return p;
}
int mid=(l+r)>>1;
if(pos<=mid) tre[p].l=add(l,mid,tre[p].l,pos,k);
else tre[p].r=add(mid+1,r,tre[p].r,pos,k);
return p;
}
char query(int l,int r,int p,int pos){
if(l==r){return tre[p].v;}
int mid=(l+r)>>1;
if(pos<=mid) return query(l,mid,tre[p].l,pos);
else return query(mid+1,r,tre[p].r,pos);
}
int main(){
cin>>n;char opt,x;
for(int i=1; i<=n; i++){
cin>>opt>>x;
if(opt=='T'){
++m;root[m]=add(1,n,root[m-1],len[m-1]+1,x);len[m]=len[m-1]+1;
}else if(opt=='U'){
++m;root[m]=root[m-(x-'0')-1];len[m]=len[m-(x-'0')-1];
}else{
cout<<query(1,n,root[m],x-'0')<<endl;
}
}
}