Submission #1005739

#TimeUsernameProblemLanguageResultExecution timeMemory
1005739pawnedCrayfish scrivener (IOI12_scrivener)C++17
100 / 100
273 ms114768 KiB
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")

#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;

const int MAX = 1e6 + 5;

int moves = 1;

vi rt(MAX);	// prev time if reverting
vi len(MAX);	// depth of vertex

char ch[MAX];	// character at vertex

int par[MAX];	// parent
int binjump[MAX][25];

void Init() {
	for (int i = 0; i < MAX; i++) {
		rt[i] = i;
	}
}

void addEdge(int n, int p, char L) {	// edge from p to n, L at n
	par[n] = p;
	// do the binjump
	binjump[n][0] = p;
	for (int i = 1; i < 25; i++) {
		binjump[n][i] = binjump[binjump[n][i - 1]][i - 1];
	}
}

void TypeLetter(char L) {
	len[moves] = len[moves - 1] + 1;
	ch[moves] = L;
	addEdge(moves, rt[moves - 1], L);
	moves++;
}

void UndoCommands(int U) {
	rt[moves] = rt[moves - U - 1];
	len[moves] = len[moves - U - 1];
	moves++;
}

char anc(int n, int m) {	// char stored at m nodes above n
	int curr = n;
	for (int i = 0; i < 25; i++) {
		if (m & (1 << i))
			curr = binjump[curr][i];
	}
	return ch[curr];
}

char GetLetter(int P) {
	int mv = len[rt[moves - 1]] - P - 1;
//	cout<<"mv: "<<mv<<endl;
	return anc(rt[moves - 1], mv);
}
#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...