Submission #1000732

#TimeUsernameProblemLanguageResultExecution timeMemory
1000732ProtonDecay314Crayfish scrivener (IOI12_scrivener)C++17
100 / 100
410 ms137532 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; class Node { public: Node* ptrs[20]; // Jump Pointers char v; Node(char a_v, Node* par): v(a_v) { if(par == nullptr) return; update_par(par); } void construct_jump_ptrs() { for(int i = 1; i < 20; i++) { ptrs[i] = ptrs[i - 1]->ptrs[i - 1]; } } void update_par(Node* par) { ptrs[0] = par; construct_jump_ptrs(); } char at(int i, int size) { int actual_ind = size - i - 1; Node* cur_ptr = this; for(int j = 0; j < 20; j++) { if((actual_ind >> j) & 0b1) cur_ptr = cur_ptr->ptrs[j]; } return cur_ptr->v; } }; vector<Node*> hist; vector<int> sizes; int last_version_ind = -1; void Init() { hist.reserve(1000001); sizes.reserve(1000001); Node* first = new Node('L', nullptr); first->update_par(first); hist.push_back(first); sizes.push_back(0); last_version_ind++; } void TypeLetter(char L) { sizes.push_back(sizes[last_version_ind] + 1); hist.push_back(new Node(L, hist[last_version_ind])); last_version_ind++; } void UndoCommands(int U) { sizes.push_back(sizes[last_version_ind - U]); hist.push_back(hist[last_version_ind - U]); last_version_ind++; } char GetLetter(int P) { return hist[last_version_ind]->at(P, sizes[last_version_ind]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...