Submission #394121

#TimeUsernameProblemLanguageResultExecution timeMemory
394121SavicSCrayfish scrivener (IOI12_scrivener)C++14
100 / 100
562 ms185664 KiB
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <bits/stdc++.h>

#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define ff(i,a,b) for(int i=a;i<=b;i++)
#define fb(i,b,a) for(int i=b;i>=a;i--)

using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1000005;
const int inf = 1e9 + 5;

template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

// os.order_of_key(k) the number of elements in the os less than k
// *os.find_by_order(k)  print the k-th smallest number in os(0-based)

int idx = 0;
int ls[50 * maxn], rs[50 * maxn], root[50 * maxn], bor[50 * maxn];
void update(int &v, int rv, int tl, int tr, int pos, int val){
	v = ++idx, ls[v] = ls[rv], rs[v] = rs[rv], bor[v] = bor[rv];
	if(tl == tr){
		bor[v]= val;
		return;
	}
	int mid = (tl + tr) / 2;
	if(pos <= mid)update(ls[v], ls[rv], tl, mid, pos, val);
	else update(rs[v], rs[rv], mid + 1, tr, pos, val);
}

int kveri(int v, int tl, int tr, int l, int r){
	if(!v || tl > r || l > tr)return 0;
	if(tl >= l && tr <= r)return bor[v];
	int mid = (tl + tr) / 2;
	return kveri(ls[v], tl, mid, l, r) + kveri(rs[v], mid + 1, tr, l, r);
}

int id = 0;
int br[50 * maxn];

void Init(){
	id = 0;
}

const int N = 1e6 + 5;
void TypeLetter(char C){
	id += 1;
	int X = C - 'a';
	br[id] = br[id - 1] + 1;
	update(root[id], root[id - 1], 1, N, br[id], X);
}

void UndoCommands(int X){
	id += 1;
	root[id] = root[id - X - 1];
	br[id] = br[id - X - 1];
}

char GetLetter(int X){
	X += 1;
	return char('a' + kveri(root[id], 1, N, X, X));
}

//int main()
//{
//   	ios::sync_with_stdio(false);
//   	cout.tie(nullptr);
//  	cin.tie(nullptr);
//	while(1){
//		int t;
//		cin >> t;
//		
//		if(t == 1){
//			char C;
//			cin >> C;
//			TypeLetter(C);
//		}
//		
//		if(t == 2){
//			int	X;
//			cin >> X;
//			UndoCommands(X);
//		}
//
//		if(t == 3){
//			int X;
//			cin >> X;
//			cout << char(GetLetter(X) + 'a') << endl;
//		}
//		
//	}
//   	return 0;
//}
/**

1 a
1 b
3 1
1 d
2 2
2 1
3 2
1 e
2 1
2 5
1 c
3 2


// probati bojenje sahovski ili slicno

**/


#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...