Submission #237347

#TimeUsernameProblemLanguageResultExecution timeMemory
237347T0p_Crayfish scrivener (IOI12_scrivener)C++14
100 / 100
520 ms207348 KiB
#include <bits/stdc++.h> using namespace std; struct node { int l, r; char c; }; int all, ver; int root[1000005], heigh[1000005]; node seg[23000000]; int build(int l, int r) { int now = ++all; if(l == r) return now; int mid = (l+r)>>1; int L = build(l, mid), R = build(mid+1, r); seg[now].l = L, seg[now].r = R; return now; } void Init() { root[0] = build(1, 1000000); } int update(int idx, int l, int r, int p, char c) { if(!(l <= p && p <= r)) return idx; int now = ++all; if(l == r) { seg[now].c = c; return now; } int mid = (l+r)>>1; int L = update(seg[idx].l, l, mid, p, c), R = update(seg[idx].r, mid+1, r, p, c); seg[now].l = L, seg[now].r = R; return now; } void TypeLetter(char L) { ver++; heigh[ver] = heigh[ver-1]+1; root[ver] = update(root[ver-1], 1, 1000000, heigh[ver], L); } void UndoCommands(int U) { ver++; heigh[ver] = heigh[ver-U-1]; root[ver] = root[ver-U-1]; } char query(int idx, int l, int r, int p) { if(l == r) return seg[idx].c; int mid = (l+r)>>1; return (p <= mid) ? query(seg[idx].l, l, mid, p) : query(seg[idx].r, mid+1, r, p); } char GetLetter(int P) { return query(root[ver], 1, 1000000, P+1); }
#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...