| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1220607 | settop | Crayfish scrivener (IOI12_scrivener) | C++20 | 0 ms | 0 KiB | 
#include<bits/stdc++.h>
 
#define eb emplace_back
#define S second
#define dbg(v) cerr << #v << " = " << v << "\n"
#define F first
#define fall(i,a,n) for(int i=a;i<=n;i++)
#define rfall(i,a,n) for(int i=a;i>=n;i--)
#define pb push_back
#define all(x) x.begin(),x.end()
#define lsb(x) (x & -x)
#define sz(x) (int)x.size()
const int MAXN=1e6+10;
const int MAXL=21;
const int inf=1e14;
const int MOD=998244353;
 
using namespace std;
typedef pair<int,int> pii;
typedef tuple<int,int,int> trio;
int cont=0,s=-1,op[MAXN]={-1},last=0;
int sparse[MAXN][MAXL];
set<pair<int,char>> st[MAXN];
void Init(){
	return;
}
void TypeLetter(char L){
	s++;
    cont++;
	st[s].insert({cont,L});
    sparse[cont][0]=last;
    fall(i,1,MAXL-1) sparse[cont][i]=sparse[sparse[cont][i-1]][i-1];
    op[cont]=s;
}
void UndoCommands(int U) {
    cont++;
    sparse[cont][0]=cont-U-1;
    fall(i,1,MAXL-1) sparse[cont][i]=sparse[sparse[cont][i-1]][i-1];
    s=op[sparse[cont][0]];
    op[cont]=s;
    last=cont;
}
char GetLetter(int P) {
    int x = cont;
    for (int i = MAXL - 1; i >= 0; --i) {
        if (sparse[x][i] != 0 && op[sparse[x][i]] >= P) {
            x = sparse[x][i];
        }
    }
    auto it = (--st[P].upper_bound({x, 'z'}));
    return it->second;
}
int32_t main(){
  	Init();
	int n; cin>>n;
	while(n--){
		char c; cin>>c;
		if(c=='T'){
			char a; cin>>a;
			TypeLetter(a);
		}
		else if(c=='U'){
			int x; cin>>x;
			UndoCommands(x);
		}
		else{
			int x; cin>>x;
			cout<<GetLetter(x)<<"\n";;
		}
	}
}
