Cod sursa(job #1816608)

Utilizator TincaMateiTinca Matei TincaMatei Data 26 noiembrie 2016 17:49:35
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <cstdio>
#include <cstdlib>
#include <time.h>

typedef struct _Treap {
  _Treap *l, *r;
  int key, size, pr;
  bool lazy;
  _Treap(int k) {
    key = k;
    pr = rand() ^ rand();
    lazy = false;
    l = r = NULL;
  };

  ~_Treap(){ delete l; delete r; };

  void recalc() {
    size = 1;
    prop();
    if(l != NULL) size += l -> size;
    if(r != NULL) size += r -> size;
  }
  void prop() {
    _Treap *aux;
    if(lazy == true) {
      if(l != NULL) l -> lazy ^= 1;
      if(r != NULL) r -> lazy ^= 1;
      aux = l;
      l = r;
      r = aux;
      lazy = false;
    }
  }
} *Treap;

void recalc(Treap x) { if(x != NULL) x -> recalc(); }

int getSize(Treap x) {
  if(x == NULL) return 0;
  recalc(x);
  return x -> size;
}

void split(Treap t, int p, Treap &l, Treap &r, int extra) {
  int poz;
  l = r = NULL;
  if(t == NULL) return;
  recalc(t);
  poz = 1 + extra + getSize(t -> l);
  if(poz < p) {
    split(t -> r, p, t -> r, r, poz);
    l = t;
    recalc(t);
  } else {
    split(t -> l, p, l, t -> l, extra);
    r = t;
    recalc(t);
  }
}

Treap join(Treap l, Treap r) {
  if(l == NULL) return r;
  if(r == NULL) return l;
  recalc(l);
  recalc(r);
  if(l->pr < r->pr) {
    l -> r = join(l -> r, r);
    recalc(l);
    return l;
  } else {
    r -> l = join(l, r -> l);
    recalc(r);
    return r;
  }
}

Treap add(Treap x, int poz, int key) {
  Treap l, r;
  split(x, poz, l, r, 0);
  return join(join(l, new _Treap(key)), r);
}

Treap erase(Treap x, int p1, int p2) {
  Treap l, m, r;
  split(x, p2 + 1, m, r, 0);
  split(m, p1, l, m, 0);
  delete m;
  return join(l, r);
}

int acces(Treap x, int p, int extra) {
  int poz;
  if(x == NULL) return -1;

  recalc(x);
  poz = 1 + extra + getSize(x -> l);
  if(poz < p)
    return acces(x -> r, p, poz);
  else if(poz > p)
    return acces(x -> l, p, extra);
  else
    return x -> key;
}

Treap reverse(Treap x, int p1, int p2) {
  Treap l, mid, r;
  split(x, p2 + 1, mid, r, 0);
  split(mid, p1, l, mid, 0);
  mid -> lazy = true;
  return join(join(l, mid), r);
}

int main() {
  int n, bit, a1, a2;
  char ch;
  Treap t;
  t = NULL;
  FILE *fin = fopen("secv8.in", "r");
  FILE *fout = fopen("secv8.out", "w");
  fscanf(fin, "%d%d", &n, &bit);
  for(int i = 0; i < n; ++i) {
    ch = fgetc(fin);
    while(ch == ' ' || ch == '\n')
      ch = fgetc(fin);
    if(ch == 'I') {
      fscanf(fin, "%d%d", &a1, &a2);
      t = add(t, a1, a2);
    } else if(ch == 'D') {
      fscanf(fin, "%d%d", &a1, &a2);
      t = erase(t, a1, a2);
    } else if(ch == 'A') {
      fscanf(fin, "%d", &a1);
      fprintf(fout, "%d\n", acces(t, a1, 0));
    } else {
      fscanf(fin, "%d%d", &a1, &a2);
      t = reverse(t, a1, a2);
    }
  }
  n = getSize(t);
  for(int i = 1; i <= n; ++i)
    fprintf(fout, "%d ", acces(t, i, 0));
  fclose(fin);
  fclose(fout);
  return 0;
}