Submission #1208682

#TimeUsernameProblemLanguageResultExecution timeMemory
1208682Dan4LifeCrayfish scrivener (IOI12_scrivener)C++17
100 / 100
259 ms143644 KiB
#include <bits/stdc++.h>
using namespace std;

const int mxN = (int)1e6+2;
const int mxLg = 160;

template<int SZ>
struct PersistentSegTree{
	char seg[SZ*mxLg];
	int L[SZ*mxLg], R[SZ*mxLg];
	int IND;
	
	void init(){ IND = 1; L[IND]=R[IND]=0; }
	
	int newChild(char x){
		int ind = ++IND;
		L[ind]=R[ind]=0; seg[ind]=x;
		return ind;
	} 
	
	int newParent(int l, int r){
		int ind = ++IND;
		L[ind] = l, R[ind] = r;
		return ind;
	}
	
	int upd(int x, char v, int p, int l=1, int r=SZ){
		if(!p) return 0;
		if(l==r) return newChild(v);
		int mid = (l+r)/2;
		if(!L[p]) L[p] = ++IND;
		if(!R[p]) R[p] = ++IND;
		if(x<=mid) return newParent(upd(x,v,L[p],l,mid),R[p]);
		return newParent(L[p],upd(x,v,R[p],mid+1,r));
	}
	
	char query(int x, int p, int l=1, int r=SZ){
		if(l==r) return seg[p];
		int mid = (l+r)/2;
		if(x<=mid) return query(x,L[p],l,mid);
		return query(x,R[p],mid+1,r);
	}
};

PersistentSegTree<mxN> seg;

int rt[mxN], sz[mxN];
int cur;

void Init(){ seg.init(); rt[0] = 1; };

void TypeLetter(char L){
	sz[cur+1] = sz[cur]+1;
	rt[cur+1] = seg.upd(sz[cur]+1,L,rt[cur]);
	cur++;
};

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

char GetLetter(int P){ return seg.query(P+1,rt[cur]); };
#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...