제출 #394122

#제출 시각아이디문제언어결과실행 시간메모리
394122SavicS크레이피쉬 글쓰는 기계 (IOI12_scrivener)C++14
100 / 100
533 ms181176 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 get(int v, int tl, int tr, int pos) {
    if(tl == tr)return bor[v];
    int mid = (tl + tr) / 2;
    if(pos <= mid)return get(ls[v], tl, mid, pos);
    else return get(rs[v], mid + 1, tr, pos);
}

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' + get(root[id], 1, N, 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 << GetLetter(X) << 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...