Submission #850922

#TimeUsernameProblemLanguageResultExecution timeMemory
850922promitheasCrayfish scrivener (IOI12_scrivener)C++14
100 / 100
451 ms155984 KiB
//CrayfishScrivener/IOI2012
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define MAXNLOG 22
#define MAXN 1000500

class Node {
public:
	char letter;
	Node* parents[MAXNLOG+1];
	int level;
	Node(Node* parent, char letter = 0) {
		level = parent ? parent->level + 1 : 0;
		this->letter = letter;
		parents[0] = parent;
		for (int i = 1; i < MAXNLOG; i++) {
			if (parents[i - 1])
				parents[i] = parents[i - 1]->parents[i - 1];
			else parents[i] = nullptr;
		}
	}
	Node* GetNthParent(int n) {
		Node* tar = this;
		for (int i = MAXNLOG; i >= 0; i--) {
			int p = 1 << i;
			if (n & p)tar = tar->parents[i];
			if (!tar)return nullptr;
		}
		return tar;
	}
};

Node* NODES[MAXN];
int N = 1;

void Init() {
	NODES[0] = nullptr;
}

void TypeLetter(char L) {
	NODES[N] = new Node(NODES[N - 1], L);
	N++;
}

void UndoCommands(int U) {
	NODES[N] = NODES[N - U - 1];
	N++;
}

char GetLetter(int L) {
	int l = NODES[N - 1]->level;
	return NODES[N - 1]->GetNthParent(l-L)->letter;
}
/*
void PrintAll() {
	Node* lastNode = NODES[N - 1];
	Node* n;
	int i = 0;
	while (n = lastNode->GetNthParent(i++))
		putc(n->letter, stdout);
	putc('\n', stdout);
}
*/
#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...