Cod sursa(job #2058076)

Utilizator TincaMateiTinca Matei TincaMatei Data 5 noiembrie 2017 05:17:30
Problema Secv8 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.92 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>

typedef struct _T{
  _T *l, *r;
  int key, prio, size;
  bool lazy;

  _T(int k) {
    key = k;
    prio = rand() ^ rand() ^ rand();
    lazy = false;
    l = r = NULL;
    size = 1;
  }

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

  void rec() {
    size = 1;
    prop();
    if(l != NULL) size += l -> size;
    if(r != NULL) size += r -> size;
  }

  void prop() {
    if(lazy) {
      _T *aux = l;
      l = r;
      r = aux;
      lazy = false;
      if(l != NULL) l -> lazy ^= 1;
      if(r != NULL) r -> lazy ^= 1;
    }
  }
} *Treap;

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

Treap join(Treap a, Treap b) {
  if(a == NULL) return b;
  if(b == NULL) return a;
  a -> rec();
  b -> rec();
  if(a -> prio < b -> prio) {
    a -> r = join(a -> r, b);
    a -> rec();
    return a;
  } else {
    b -> l = join(a, b -> l);
    b -> rec();
    return b;
  }
}

void split(Treap x, int poz, Treap &l, Treap &r, int left) {
  l = r = NULL;
  if(x == NULL)
    return;
  x -> rec();
  int p = left + 1 + getsize(x -> l);
  if(p < poz) {
    split(x -> r, poz, x -> r, r, p);
    l = x;
    l -> rec();
  } else {
    split(x -> l, poz, l, x -> l, left);
    r = x;
    r -> rec();
  }
}

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

Treap del(Treap x, int a, int b) {
  Treap l, m, r;
  split(x, b + 1, m, r, 0);
  split(m, a, l, m, 0);
  delete(m);
  return join(l, r);
}

int acces(Treap x, int poz) {
  int val;
  Treap l, m, r;
  split(x, poz + 1, m, r, 0);
  split(m, poz, l, m, 0);
  val = m -> key;
  join(join(l, m), r);
  return val;
}

Treap rev(Treap x, int a, int b) {
  Treap l, m, r;
  split(x, b + 1, m, r, 0);
  split(m, a, l, m, 0);
  m -> lazy ^= 1;
  return join(join(l, m), r);
}

char getch(FILE *fin) {
  char ch = fgetc(fin);
  while(ch == ' ' || ch == '\n')
    ch = fgetc(fin);
  return ch;
}

void debug(Treap x) {
  for(int i = 0; i < getsize(x); ++i)
    printf("!%d ", acces(x, i + 1));
  printf("\n");
}

int main() {
  int m, garb, a, b, c;
  char tip;
  Treap x = NULL;
  srand(time(NULL));
  FILE *fin = fopen("secv8.in", "r");
  FILE *fout = fopen("secv8.out", "w");
  fscanf(fin, "%d%d", &m, &garb);
  for(int i = 0; i < m; ++i) {
    tip = getch(fin);
    if(tip == 'I') {
      fscanf(fin, "%d%d", &a, &b);
      x = add(x, b, a);
    } else if(tip == 'D') {
      fscanf(fin, "%d%d", &a, &b);
      x = del(x, a, b);
    } else if(tip == 'A') {
      fscanf(fin, "%d", &a);
      fprintf(fout, "%d\n", acces(x, a));
    } else {
      fscanf(fin, "%d%d", &a, &b);
      x = rev(x, a, b);
    }
  }

  for(int i = 0; i < getsize(x); ++i)
    fprintf(fout, "%d ", acces(x, i + 1));
  fclose(fin);
  fclose(fout);
  return 0;
}