Cod sursa(job #2032991)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 5 octombrie 2017 22:38:07
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <cstdio>
#include <algorithm>
#include <ctime>
#include <cstdlib>

using namespace std;

struct N {
  int v, sz, pr;
  N* l;
  N* r;
  bool rv;
};

N* eN = new N {0, 0, -1, NULL, NULL, 0};

typedef pair<N*, N*> p;

void unrv(N* t) {
  if (t != eN && t->rv) {
    swap(t->l, t->r);
    t->l->rv ^= 1;
    t->r->rv ^= 1;
    t->rv = 0;
  }
}

void rcmp(N* t) {
  t->sz = t->l->sz + 1 + t->r->sz;
}

p s(N* t, int k) {
  unrv(t);
  p ans;
  if (t == eN) {
    ans.first = eN;
    ans.second = eN;
  } else if (t->l->sz >= k) {
    ans.second = t;
    p aux = s(t->l, k);
    ans.first = aux.first;
    ans.second->l = aux.second;
    rcmp(ans.second);
  } else {
    ans.first = t;
    p aux = s(t->r, k - t->l->sz - 1);
    ans.second = aux.second;
    ans.first->r = aux.first;
    rcmp(ans.first);
  }
  return ans;
}

N* j(N* t1, N* t2) {
  unrv(t1);
  unrv(t2);
  if (t1 == eN) {
    return t2;
  }
  if (t2 == eN) {
    return t1;
  }
  if (t1->pr > t2->pr) {
    t1->r = j(t1->r, t2);
    rcmp(t1);
    return t1;
  } else {
    t2->l = j(t1, t2->l);
    rcmp(t2);
    return t2;
  }
}

int acc(N* t, int k) {
  unrv(t);
  if (t->l->sz >= k)
    return acc(t->l, k);
  if (t->l->sz + 1 == k)
    return t->v;
  return acc(t->r, k - t->l->sz - 1);
}

N* ins(N* t, int k, int v) {
  N* n = new N{v, 1, rand(), eN, eN, 0};
  p aux = s(t, k - 1);
  return j(j(aux.first, n), aux.second);
}

N* del(N* t, int st, int dr) {
  p p1 = s(t, st - 1);
  p p2 = s(p1.second, dr - st + 1);
  return j(p1.first, p2.second);
}

N *rev(N* t, int st, int dr) {
  p p1 = s(t, st - 1);
  p p2 = s(p1.second, dr - st + 1);
  p2.first->rv ^= 1;
  return j(j(p1.first, p2.first), p2.second);
}

int main() {
  freopen("secv8.in", "r", stdin);
  freopen("secv8.out", "w", stdout);

  srand(time(NULL));

  int n, r;
  scanf("%d%d ", &n, &r);
  N* t = eN;

  for (int i = 1; i <= n; ++i) {
    char c;
    scanf("%c", &c);
    switch(c) {
      case 'I': {int k, e; scanf("%d%d ", &k, &e); t = ins(t, k, e); break;}
      case 'A': {int k; scanf("%d ", &k); printf("%d\n", acc(t, k)); break;}
      case 'R': {int st, dr; scanf("%d%d ", &st, &dr); t = rev(t, st, dr); break;}
      case 'D': {int st, dr; scanf("%d%d ", &st, &dr); t = del(t, st, dr); break;}
    }
  }

  for (int i = 1; i <= t->sz; ++i)
    printf("%d ", acc(t, i));
  printf("\n");

  return 0;
}