#include<bits/stdc++.h>
using namespace std;
int sz[1000005];
int num = 0;
struct segtree{
  vector<vector<int>> t;
  char let[20000000];
  vector<int> roots;
  int cnt = 0;
  segtree(){
    int root = build(0, 1000001);
    roots.push_back(root);
  }
  int build(int lo, int hi){
    if(lo == hi){
      t.push_back({lo, hi});
      let[cnt] = ' ';
      cnt++;
      return cnt-1;
    }
    int mid = lo + (hi - lo) / 2;
    int l = build(lo, mid);
    int r = build(mid+1, hi);
    t.push_back({l, r});
    let[cnt] = ' ';
    cnt++;
    return cnt-1;
  }
  int updt(int no, int lo, int hi, int tar, char l){
    if(lo == hi){
      let[cnt] = l;
      t.push_back({lo, hi});
      cnt++;
      return cnt-1; 
    } 
    int mid = lo + (hi - lo) / 2;
    if(tar <= mid){
      t.push_back((vector<int>){updt(t[no][0], lo, mid, tar, l), t[no][1]});
      let[cnt] = ' ';
      cnt++;
      return cnt-1;
    }else{
      t.push_back((vector<int>){t[no][0], updt(t[no][1], mid+1, hi, tar, l)});
      cnt++;
      return cnt-1;
    }
  }
  void update(int k, int pos, char l){
    roots[k] = updt(roots[k], 0, 1000001, pos, l);
  }
  char query(int no, int lo, int hi, int tar){
    if(lo == hi){
      return let[no];
    }
    int mid = lo + (hi - lo) / 2;
    if(tar <= mid){
      return query(t[no][0], lo, mid, tar);
    }else{
      return query(t[no][1], mid+1, hi, tar);
    }
  }
  char ask(int k, int pos){
    return query(roots[k], 0, 1000001, pos);
  }
  void copy(int k){
    roots.push_back(roots[k]);
  }
};
segtree tree;
void Init() {
  sz[0] = 0;
  num = 1;
}
void TypeLetter(char L) {
  tree.copy(num-1);
  tree.update(num, sz[num-1], L);
  sz[num] = sz[num-1]+1;
  num++;
}
void UndoCommands(int U) {
  int tar = num - U - 1;
  sz[num] = sz[tar];
  tree.copy(tar);
  num++;
}
char GetLetter(int P) {
  //cout << "answer " << tree.ask(num-1, P) << endl;
  return tree.ask(num-1, P);
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |