#include <bits/stdc++.h>
using namespace std;
const int N = (1e5 + 5) * 25;
int val[N] , ls[N] , rs[N] , root[N] , n;
int cnt , len[N] , top = 0;
inline void push_up (int o)
{
val[o] = val[ls[o]] + val[rs[o]];
}
inline int build_tree (int l , int r)
{
int o = cnt++;
if (l == r) return len[o] = 1 , o;
int mid = l + r >> 1;
ls[o] = build_tree (l , mid);
rs[o] = build_tree (mid + 1 , r);
push_up (o);
return o;
}
inline int Copy (int pre)
{
int o = cnt++;
val[o] = val[pre];
ls[o] = ls[pre];
rs[o] = rs[pre];
len[o] = len[pre];
return o;
}
inline void insert (int &pos , int o , int l , int r , int now , int v)
{
pos = Copy (o);
if (l == r) val[pos] = v , len[pos]++;
int mid = l + r >> 1;
if (now <= mid)
insert (ls[pos] , ls[o] , l , mid , now , v);
else
insert (rs[pos] , rs[o] , mid + 1 , r , now , v);
}
inline int query (int o , int l , int r , int now)
{
if (l == r) return val[o];
int mid = l + r >> 1;
if (now <= mid)
return query (ls[o] , l , mid , now);
else
return query (rs[o] , mid + 1 , r , now);
}
signed main ()
{
std :: cin >> n;
fflush (stdin);
root[0] = build_tree (1 , 100000);
for (int i = 1; i <= n; i++)
{
char opt;
cin >> opt;
if (opt == 'T')
{
char c;
cin >> c;
insert (root[++top] , root[top - 1] , 1 , 100000 , len[top] + 1 , (int) (c));
}
else if (opt == 'U')
{
int x;
cin >> x;
root[top] = root[top - x];
}
else
{
int x;
cin >> x;
cout << (char) (query (root[top] , 1 , 100000 , x)) << endl;
}
}
return 0;
}
RT