Cod sursa(job #2823944)

Utilizator lucametehauDart Monkey lucametehau Data 30 decembrie 2021 11:49:28
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.99 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <cstring>
#include <chrono>
#include <cassert>
#include <bitset>
#include <stack>
#include <queue>
#include <iomanip>

//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define x first
#define y second
#define ld long double
#define ll long long
#define ull unsigned long long
#define us unsigned short
#define lsb(x) ((x) & (-(x)))
#define pii pair <int, int>

using namespace std;

ifstream in("secv8.in");
ofstream out("secv8.out");

struct Treap {
  int key, prio, size;
  bool rev;

  Treap* l, * r;

  Treap(int _key) {
    key = _key;
    prio = rand();
    size = 1;
    rev = 0;
    l = r = NULL;
  }
};

void push(Treap*& t) {
  if (t && t->rev) {
    swap(t->l, t->r);
    t->rev ^= 1;
    if (t->l)
      t->l->rev ^= 1;
    if (t->r)
      t->r->rev ^= 1;
  }
}

int size(Treap* t) {
  return (!t ? 0 : t->size);
}

void split(Treap* t, Treap*& l, Treap*& r, int val) {
  if (!t) {
    l = r = NULL;
    return;
  }

  push(t);

  if (size(t->l) < val) {
    split(t->r, t->r, r, val - size(t->l) - 1);
    l = t;
  }
  else {
    split(t->l, l, t->l, val);
    r = t;
  }

  t->size = 1 + size(t->l) + size(t->r);
}

void merge(Treap*& t, Treap* l, Treap* r) {
  push(l); push(r);

  if (!l) {
    t = r;
    return;
  }
  if (!r) {
    t = l;
    return;
  }

  if (l->prio < r->prio) {
    merge(l->r, l->r, r);
    t = l;
  }
  else {
    merge(r->l, l, r->l);
    t = r;
  }

  t->size = 1 + size(t->l) + size(t->r);
}

int get(Treap* t, int val) {
  push(t);
  if (val == size(t->l) + 1)
    return t->key;

  if (size(t->l) < val) {
    return get(t->r, val - size(t->l) - 1);
  }

  return get(t->l, val);
}

void reverse(Treap* t, int l, int r) {
  Treap* a, * b, * c;

  split(t, a, b, l - 1);
  split(b, b, c, r - l + 1);

  b->rev ^= 1;

  merge(t, a, b);
  merge(t, t, c);
}

void print(Treap* t) {
  if (!t)
    return;

  push(t);
  print(t->l);
  out << t->key << " ";
  print(t->r);
}

int n, m;
int x, y;
char op;

Treap* t, * a, * b, * c;

int main() {
  in >> m >> n;

  for (; m; m--) {
    in >> op >> x;
    /*Treap* a, * b, * c;
    split(t, a, b, l - 1);
    split(b, b, c, r - l + 1);
    merge(t, a, c);
    merge(t, t, b);*/
    if (op == 'I') {
      in >> y;

      split(t, a, b, x - 1);
      merge(a, a, new Treap(y));
      merge(t, a, b);
    }
    else if (op == 'A') {
      out << get(t, x) << "\n";
    }
    else if (op == 'R') {
      in >> y;
      reverse(t, x, y);
    }
    else {
      in >> y;

      split(t, a, b, x - 1);
      split(b, b, c, y - x + 1);
      merge(t, a, c);
    }

    //print(t);
    //cout << "\n";
  }

  print(t);
  return 0;
}