제출 #237284

#제출 시각아이디문제언어결과실행 시간메모리
237284T0p_크레이피쉬 글쓰는 기계 (IOI12_scrivener)C++14
74 / 100
548 ms262148 KiB
#include <bits/stdc++.h> using namespace std; struct node { int v, l, r; char c; }; int all, ver; int root[1000005]; node seg[24000000]; 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] = {0, L, 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].v = 1; 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, seg[now].v = seg[L].v+seg[R].v; return now; } void TypeLetter(char L) { ver++; root[ver] = update(root[ver-1], 1, 1000000, seg[root[ver-1]].v+1, L); } void UndoCommands(int U) { ver++; 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...