/*#pragma GCC optimize("O3")*/
#include<bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//#define ordered_set tree<int, null_type,less<int >, rb_tree_tag,tree_order_statistics_node_update>
#define eps 1e-9
#define MOD1 998244353
#define MOD2 1000000007
#define INV_10 299473306
#define INF 1000000001
#define PI 3.14159265358979323846
using namespace std;
int pos=0;
vector<int>v, depth;
vector<char>tree;
vector<int>anc[1000005];
void process(int x, int y)
{
int nb=0;
bool ok=true;
anc[x].push_back(y);
while(ok)
{
int cu=anc[x].back();
if(anc[cu].size() > nb)
{
anc[x].push_back(anc[cu][nb]);
nb++;
}
else
ok=false;
}
}
char find_kth(int x, int k)
{
int nb=0;
while(k)
{
if(k%2==1)
x=anc[x][nb];
nb++;
k/=2;
}
return tree[x];
}
void Init()
{
v.clear();
tree.clear();
depth.clear();
tree.push_back('0');
depth.push_back(0);
v.push_back(0);
for(int i = 0; i < 1000005; i++)
{
anc[i].clear();
}
pos=0;
}
void TypeLetter(char L)
{
tree.push_back(L);
process(tree.size()-1, pos);
depth.push_back(depth[pos]+1);
pos=tree.size()-1;
v.push_back(pos);
cout << pos << ' ' << tree[pos] << '\n';
}
void UndoCommands(int U)
{
int l=v.size();
v.push_back(v[l-1-U]);
pos=v.back();
depth.push_back(depth[pos]);
cout << pos << ' ' << tree[pos] << '\n';
}
char GetLetter(int P)
{
P++;
return find_kth(pos, depth.back()-P);
}
int main()
{
while(1)
{
int t;
cin >> t;
if(t==0)
Init();
if(t==1)
{
char c;
cin >> c;
TypeLetter(c);
}
if(t==2)
{
int x;
cin >> x;
UndoCommands(x);
}
if(t==3)
{
int x;
cin >> x;
cout << GetLetter(x) << '\n';
}
}
}
//size
Compilation message
scrivener.cpp: In function 'void process(int, int)':
scrivener.cpp:25:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(anc[cu].size() > nb)
~~~~~~~~~~~~~~~^~~~
/tmp/ccGXiZPY.o: In function `main':
scrivener.cpp:(.text.startup+0x0): multiple definition of `main'
/tmp/cc0atdbK.o:grader.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status