Cod sursa(job #2978218)

Utilizator retrogradLucian Bicsi retrograd Data 13 februarie 2023 13:30:54
Problema Secv8 Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <bits/stdc++.h>

using namespace std;

struct Sqrt {
  vector<int> v;
  vector<pair<int, int>> blocks;

  void Insert(int k, int x) {
    int pos = split(k);
    blocks.insert(blocks.begin() + pos, {v.size(), v.size()});
    v.push_back(x);
    balance();
  }
  int Access(int k) {
    int ret = v[blocks[split(k)].first];
    balance();
    return ret;
  }
  void Reverse(int l, int r) {
    int posl = split(l), posr = split(r);
    for (int i = posl; i < posr; ++i) 
      swap(blocks[i].first, blocks[i].second);
    reverse(blocks.begin() + posl, blocks.begin() + posr);
    balance();
  }
  void Delete(int l, int r) {
    int posl = split(l), posr = split(r);
    blocks.erase(blocks.begin() + posl, blocks.begin() + posr);
    balance();
  }
  int split(int k) {
    for (int i = 0; i < (int)blocks.size(); ++i) {
      if (k == 0) return i;
      auto [l, r] = blocks[i];
      int step = (l > r) ? -1 : 1;
      int sz = abs(r - l) + 1;
      if (k < sz) {
        int mid = l + step * k;
        blocks[i].first = mid;
        blocks.insert(blocks.begin() + i, {l, mid - step});
        return i + 1;
      }
      k -= sz;
    }
    return blocks.size();
  }
  void balance(bool force = false) {
    if (force && blocks.size() < 300) return;
    vector<int> nv;
    for (auto [l, r] : blocks) {
      int step = (l > r) ? -1 : 1;
      for (int i = l; i != r + step; i += step)
        nv.push_back(v[i]);
    }
    v = nv;
    blocks = {{0, v.size() - 1}};
  }
};

int main() {
  ifstream cin("secv8.in");
  ofstream cout("secv8.out");
  
  int q, _; cin >> q >> _;
  Sqrt S;
  while (q--) {
    char c; cin >> c;
    if (c == 'I') {
      int k, x; cin >> k >> x; 
      S.Insert(k - 1, x);
    }
    if (c == 'R') {
      int l, r; cin >> l >> r;
      S.Reverse(l - 1, r);
    }
    if (c == 'D') {
      int l, r; cin >> l >> r;
      S.Delete(l - 1, r);
    }
    if (c == 'A') {
      int k; cin >> k;
      cout << S.Access(k - 1) << '\n';
    }
  }
  S.balance(true);
  for (auto x : S.v) 
    cout << x << " "; 
  cout << endl;
  return 0;
}