#include<bits/stdc++.h>
using namespace std;
int sz[1000005];
int num = 0;
struct segtree{
  vector<int> left, right;
  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){
      left.push_back(lo);
      right.push_back(hi);
      cnt++;
      return cnt-1;
    }
    int mid = lo + (hi - lo) / 2;
    int l = build(lo, mid);
    int r = build(mid+1, hi);
    left.push_back(l);
    right.push_back(r);
    cnt++;
    return cnt-1;
  }
  int updt(int no, int lo, int hi, int tar, char l){
    if(lo == hi){
      let[cnt] = l;
      left.push_back(lo);
      right.push_back(hi);
      cnt++;
      return cnt-1; 
    } 
    int mid = lo + (hi - lo) / 2;
    if(tar <= mid){
      int nl = updt(left[no], lo, mid, tar, l);
      left.push_back(nl);
      right.push_back(right[no]);
      cnt++;
      return cnt-1;
    }else{
      int nr = updt(right[no], mid+1, hi, tar, l);
      left.push_back(left[no]);
      right.push_back(nr);
      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(left[no], lo, mid, tar);
    }else{
      return query(right[no], 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... |