Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef _DEBUG
- #define _GLIBCXX_DEBUG
- #endif
- #define _CRT_SECURE_NO_WARNINGS
- #include <ext/pb_ds/assoc_container.hpp>
- #include <bits/stdc++.h>
- /// НАБИРАЕМ БАЛЛЫ
- /// ░░░░░░▄▀▀▀▄░РАБОТЯГИ░░
- /// ▄███▀░◐░░░▌░░░░░░░
- /// ░░░░▌░░░░░▐░░░░░░░
- /// ░░░░▐░░░░░▐░░░░░░░
- /// ░░░░▌░░░░░▐▄▄░░░░░
- /// ░░░░▌░░░░▄▀▒▒▀▀▀▀▄
- /// ░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
- /// ░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
- /// ░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
- /// ░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
- /// ░░░░░░░░░░░▌▌░▌▌░░░░░
- /// ░░░░░░░░░░░▌▌░▌▌░░░░░
- /// ░░░░░░░░░▄▄▌▌▄▌▌░░░░░
- using namespace __gnu_pbds;
- using namespace std;
- typedef long long ll;
- typedef vector<ll> vll;
- typedef pair<int, int> pii;
- typedef vector<int> vi;
- typedef long double ld;
- typedef tree<pair<ll, int>, null_type, less<pair<ll, int>>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
- #define mk make_pair
- #define inb push_back
- #define enb emplace_back
- #define X first
- #define Y second
- #define all(v) v.begin(), v.end()
- #define sqr(x) (x) * (x)
- #define TIME 1.0 * clock() / CLOCKS_PER_SEC
- #define y1 AYDARBOG
- //continue break pop_back return
- int solve();
- int main()
- {
- //ios_base::sync_with_stdio(0);
- //cin.tie(0);
- #define TASK "reverse"
- #ifndef _DEBUG
- freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
- #endif
- solve();
- #ifdef _DEBUG
- fprintf(stderr, "\nTIME: %.3f\n", TIME);
- #endif
- }
- const int INF = 2e9 + 7;
- const int BUFSZ = (int)1e6 + 7;
- char buf[BUFSZ];
- string get_str()
- {
- scanf(" %s", buf);
- return string(buf);
- }
- mt19937 mrand(306);
- struct Node
- {
- int val, y, l, r, sz, f;
- Node() { val = 0, y = mrand(), l = 0, r = 0, sz = 0, f = 0; };
- Node(int val) : val(val), y(mrand()), l(0), r(0), sz(1), f(0) {};
- };
- Node t[BUFSZ];
- void recalc(int v)
- {
- t[v].sz = t[t[v].l].sz + t[t[v].r].sz + 1;
- }
- void update(int v)
- {
- if (!v)
- return;
- recalc(v);
- if (!t[v].f)
- return;
- if (t[v].f)
- swap(t[v].l, t[v].r);
- t[t[v].l].f ^= t[v].f;
- t[t[v].r].f ^= t[v].f;
- t[v].f = 0;
- }
- pii split(int v, int x)
- {
- update(v);
- if (!v)
- return mk(0, 0);
- if (t[t[v].l].sz < x)
- {
- pii cur = split(t[v].r, x - t[t[v].l].sz - 1);
- t[v].r = cur.X;
- recalc(v);
- return mk(v, cur.Y);
- }
- else
- {
- pii cur = split(t[v].l, x);
- t[v].l = cur.Y;
- recalc(v);
- return mk(cur.X, v);
- }
- }
- int merge(int l, int r)
- {
- update(l), update(r);
- if (l * r == 0)
- {
- if (l)
- return l;
- return r;
- }
- if (t[l].y > t[r].y)
- {
- t[l].r = merge(t[l].r, r);
- recalc(l);
- return l;
- }
- else
- {
- t[r].l = merge(l, t[r].l);
- recalc(r);
- return r;
- }
- }
- int find(int v, int x)
- {
- update(v);
- if (t[t[v].l].sz + 1 == x)
- return t[v].val;
- if (t[t[v].l].sz < x)
- return find(t[v].r, x - t[t[v].l].sz - 1);
- return find(t[v].l, x);
- }
- void print(int v)
- {
- update(v);
- if (!v)
- return;
- print(t[v].l);
- printf("%d ", t[v].val);
- print(t[v].r);
- }
- int solve()
- {
- int n, q;
- scanf("%d %d", &n, &q);
- int root = 1;
- for (int i = 0; i < n; ++i)
- {
- int x;
- scanf("%d", &x);
- t[i + 1] = Node(x);
- if (i)
- root = merge(root, i + 1);
- }
- while (q--)
- {
- string cmd = get_str();
- if (cmd[0] == 'R')
- {
- int l, r;
- scanf("%d %d", &l, &r);
- --l, --r;
- pii spl = split(root, l);
- int tl = spl.X;
- int mid = spl.Y;
- spl = split(mid, r - l + 1);
- int tr = spl.Y;
- mid = spl.X;
- t[mid].f ^= 1;
- update(mid);
- root = merge(tl, mid);
- root = merge(root, tr);
- }
- else
- {
- int x;
- scanf("%d", &x);
- printf("%d\n", find(root, x));
- }
- }
- print(root);
- puts("");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement