Submission #406440

#TimeUsernameProblemLanguageResultExecution timeMemory
406440T0p_Crayfish scrivener (IOI12_scrivener)C++14
100 / 100
561 ms208892 KiB
#include <bits/stdc++.h>
using namespace std;

struct node
{
	char c;
	int L, R;
};

int all, ver;
int root[1000005], num[1000005];
node seg[24000000];

int build(int l, int r)
{
	int now = ++all;
	if(l == r) return now;
	int mid = (l+r)>>1;
	seg[now].L = build(l, mid), seg[now].R = build(mid+1, r);
	return now;
}

int update(int l, int r, int idx, 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(l, mid, seg[idx].L, p, c), R = update(mid+1, r, seg[idx].R, p, c);
	seg[now].L = L;
	seg[now].R = R;
	return now;
}

char query(int l, int r, int idx, int p)
{
	if(l == r) return seg[idx].c;
	int mid = (l+r)>>1;
	return (p <= mid) ? query(l, mid, seg[idx].L, p) : query(mid+1, r, seg[idx].R, p);
}

void Init()
{
	root[0] = build(1, 1000000);
}

void TypeLetter(char L)
{
	ver++;
	num[ver] = num[ver-1] + 1;
	root[ver] = update(1, 1000000, root[ver-1], num[ver], L);
}

void UndoCommands(int U)
{
	ver++;
	num[ver] = num[ver-U-1];
	root[ver] = root[ver-U-1];
}

char GetLetter(int P)
{
	return query(1, 1000000, root[ver], 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...