Cod sursa(job #3299264)

Utilizator LucaMuresanMuresan Luca Valentin LucaMuresan Data 5 iunie 2025 10:18:36
Problema Secv8 Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.24 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <random>

#define debug(x) #x << " = " << x << '\n'
using ll = long long;

std::mt19937 rng(123);

struct Treap {
  struct Node {
    int key, prio, sz;
    bool rev;
    Node* l;
    Node* r;
    Node(int x = 0, int s = 0) : key(x), prio(rng()), sz(s), rev(false), l(nullptr), r(nullptr) {}
    void push() {
      if (rev) {
        std::swap(l, r);
        if (l) {
          l -> rev ^= 1;
        }
        if (r) {
          r -> rev ^= 1;
        }
        rev = false;
      }
    }
    void refresh() {
      sz = 1;
      if (l) {
        sz += l -> sz;
      }
      if (r) {
        sz += r -> sz;
      }
    }
  };

  Node* root = new Node();

  void split(Node* t, Node* &l, Node* &r, int x) {
    if (!t) {
      l = r = nullptr;
      return;
    }
    t -> push();
    int szl = 1 + (t -> l? t -> l -> sz : 0);
    if (x < szl) {
      split(t -> l, l, t -> l, x);
      r = t;
    } else {
      split(t -> r, t -> r, r, x - szl);
      l = t;
    }
    t -> refresh();
  }

  void join(Node* &t, Node* l, Node* r) {
    if (!l || !r) {
      t = l? l : r;
      return;
    }
    l -> push();
    r -> push();
    if (l -> prio > r -> prio) {
      join(l -> r, l -> r, r);
      t = l;
    } else {
      join(r -> l, l, r -> l);
      t = r;
    }
    t -> refresh();
  }

  void insert(int p, int v) {
    Node* l;
    Node* r;
    split(root, l, r, p - 1);
    join(root, l, new Node(v, 1));
    join(root, root, r);
  }

  void erase(int st, int dr) {
    Node* l;
    Node* mid;
    Node* r;
    split(root, l, r, st - 1);
    split(r, mid, r, dr - st + 1);
    join(root, l, r);
  }
  int acces(int p) {
    Node* l;
    Node* mid;
    Node* r;
    split(root, l, r, p - 1);
    split(r, mid, r, 1);
    int ret = mid -> key;
    join(root, l, mid);
    join(root, root, r);
    return ret;
  }
  void reverse(int st, int dr) {
    Node* l;
    Node* mid;
    Node* r;
    split(root, l, r, st - 1);
    split(r, mid, r, dr - st + 1);
    mid -> rev ^= 1;
    join(root, l, mid);
    join(root, root, r);
  }
  void print(Node* T) {
    if (T == nullptr) {
      return;
    }
    print(T -> l);
    std::cout << T -> key << ' ';
    print(T -> r);
  }
  void print() {
    Node* ts;
    split(root, root, ts, root -> sz - 1);
    print(root);
    std::cout << '\n';
  }
};

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(0);
  std::cout.tie(0);
#ifdef LOCAL
  freopen("input.txt", "r", stdin);
#else
  freopen("secv8.in", "r", stdin);
  freopen("secv8.out", "w", stdout);
#endif

  Treap DS;

  int q, ts;
  std::cin >> q >> ts;

  for (int i = 0; i < q; i++) {
    char type;
    std::cin >> type;
    if (type == 'I') {
      int p, v;
      std::cin >> p >> v;
      DS.insert(p, v);
    } else if (type == 'A') {
      int p;
      std::cin >> p;
      std::cout << DS.acces(p) << '\n';
    } else if (type == 'R') {
      int l, r;
      std::cin >> l >> r;
      DS.reverse(l, r);
    } else {
      int l, r;
      std::cin >> l >> r;
      DS.erase(l, r);
    }
  }

  DS.print();

  return 0;
}