Cod sursa(job #3160356)

Utilizator matei0000Neacsu Matei matei0000 Data 23 octombrie 2023 19:28:06
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
#define ptt pair<tr*,tr*>
#define fr first
#define sc second
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());struct tr{int prio, mar, val, lazy;tr *st, *dr;tr(int v, int p){prio = p;mar = 1;val = v;lazy = 0;st = dr = NULL;}};tr *root;int mr(tr *a){if(a == NULL)return 0;return a->mar;}void update(tr *a){if(a == NULL)return;a->mar = mr(a->st) + mr(a->dr) + 1;}void pr(tr *a){if(a == NULL)return;if(a->lazy){swap(a->st, a->dr);if(a->st != NULL)a->st->lazy ^= 1;if(a->dr != NULL)a->dr->lazy ^= 1;a->lazy = 0;}}tr* join(tr *a, tr *b){pr(a);pr(b);if(a == NULL)return b;if(b == NULL)return a;if(a->prio > b->prio){a->dr = join(a->dr, b);update(a);return a;}else{b->st = join(a, b->st);update(b);return b;}}ptt sp(tr *a, int x){pr(a);if(a == NULL)return {NULL, NULL};if(x == 0)return {NULL, a};if(x == a->mar)return {a, NULL};if(x <= mr(a->st)){ptt rez = sp(a->st, x);a->st = rez.sc;update(a);return {rez.fr, a};}else{ptt rez = sp(a->dr, x - mr(a->st) - 1);a->dr = rez.fr;update(a);return {a, rez.sc};}}ifstream in("secv8.in");ofstream out("secv8.out");int acces(tr *nod, int x){pr(nod);if(x == mr(nod->st) + 1)return nod->val;if(x <= mr(nod->st))return acces(nod->st, x);return acces(nod->dr, x - mr(nod->st) - 1);}void afis(tr *nod){if(nod == NULL)return;pr(nod);afis(nod->st);out << nod->val << " ";afis(nod->dr);}int main(){int q, useless;in >> q >> useless;for(int rt = 0; rt < q; rt ++){char ch;in >> ch;if(ch == 'I'){int k, e;in >> k >> e;ptt r = sp(root, k - 1);root = join(r.fr, join(new tr(e, rng()), r.sc));}else if(ch == 'A'){int k;in >> k;out << acces(root, k) << '\n';}else if(ch == 'R'){int i, j;in >> i >> j;ptt r1 = sp(root, i - 1);ptt r2 = sp(r1.sc, j - i + 1);r2.fr->lazy ^= 1;root = join(r1.fr, join(r2.fr, r2.sc));}else{int i, j;in >> i >> j;ptt r1 = sp(root, i - 1);ptt r2 = sp(r1.sc, j - i + 1);root = join(r1.fr, r2.sc);}}afis(root);}