#include <iostream>
using namespace std;
struct hjt_tree
{
int l, r, s;
char k;
} t[3000100];
int cnt, rt[100100];
inline int copy (int tp)
{
t[++cnt] = t[tp];
return cnt;
}
inline void update (int &tp, int l, int r, char k)
{
tp = copy (tp);
if (l == r) {t[tp].k = k, t[tp].s = 1; return ;}
int mid = (l + r) >> 1;
if (t[t[tp].l].s != mid - l + 1) update (t[tp].l, l, mid, k);
else update (t[tp].r, mid + 1, r, k);
t[tp].s = t[t[tp].l].s + t[t[tp].r].s;
}
inline char query (int tp, int l, int r, int k)
{
if (l == r) return t[tp].k;
int mid = (l + r) >> 1;
if (k <= t[t[tp].l].s) return query (t[tp].l, l, mid, k);
else return query (t[tp].r, mid + 1, r, k - t[t[tp].l].s);
}
int main ()
{
int n, v;
cin >> n;
for (int i = 1; i <= n; ++i)
{
char op;
cin >> op;
if (op == 'T')
{
char x;
cin >> x;
++v, rt[v] = rt[v - 1];
update (rt[v], 1, n, x);
}
else if (op == 'U')
{
int x;
cin >> x;
++v, rt[v] = rt[v - x - 1];
}
else
{
int x;
cin >> x;
cout << query (rt[v], 1, n, x) << "\n";
}
}
return 0;
}