Cod sursa(job #2318860)

Utilizator TincaMateiTinca Matei TincaMatei Data 13 ianuarie 2019 16:03:42
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <bits/stdc++.h>

using namespace std;

typedef struct Node {
  Node *l, *r;
  int k, p, size;
  bool lazy;

  Node(int _k) {
    k = _k;
    p = rand() ^ rand() ^ rand();
    l = r = NULL;
    size = 1;
    lazy = false;
  }

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

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

    if(lazy) {
      swap(l, r);
      if(l != NULL) l->lazy ^= 1;
      if(r != NULL) r->lazy ^= 1;
      lazy = false;
    }
  }
} *Treap;

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

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

void split(Treap t, int poz, Treap &a, Treap &b, int pleft) {
  a = b = NULL;
  if(t == NULL) return;

  t->refresh();
  int px = pleft + 1 + getsize(t->l);

  if(px < poz) {
    split(t->r, poz, t->r, b, px);
    t->refresh();
    a = t;
  } else {
    split(t->l, poz, a, t->l, pleft);
    t->refresh();
    b = t;
  }
}

Treap add(Treap t, int val, int poz) {
  Treap l, r;
  split(t, poz, l, r, 0);
  return join(join(l, new Node(val)), r);
}

Treap del(Treap t, int l, int r) {
  Treap lT, rT, mT;
  split(t, r + 1, mT, rT, 0);
  split(mT, l, lT, mT, 0);

  delete mT;

  return join(lT, rT);
}

int findT(Treap t, int k) {
  Treap lT, rT, mT;
  split(t, k + 1, mT, rT, 0);
  split(mT, k, lT, mT, 0);

  int rez = mT->k;
  join(join(lT, mT), rT);

  return rez;
}

Treap rev(Treap t, int l, int r) {
  Treap lT, rT, mT;
  split(t, r + 1, mT, rT, 0);
  split(mT, l, lT, mT, 0);

  mT->lazy ^= 1;

  return join(join(lT, mT), rT);
}

char getCh(FILE *fin) {
  char ch = fgetc(fin);
  while(!isalpha(ch))
    ch = fgetc(fin);
  return ch;
}

int main() {
  srand(time(NULL));
  int n, garb;
  Treap t = NULL;
  FILE *fin = fopen("secv8.in", "r");
  FILE *fout = fopen("secv8.out", "w");

  fscanf(fin, "%d%d", &n, &garb);

  for(int i = 0; i < n; ++i) {
    char ch = getCh(fin);
    if(ch == 'I') {
      int k, e;
      fscanf(fin, "%d%d", &k, &e);
      t = add(t, e, k);
    } else if(ch == 'D') {
      int i, j;
      fscanf(fin, "%d%d", &i, &j);
      t = del(t, i, j);
    } else if(ch == 'R') {
      int i, j;
      fscanf(fin, "%d%d", &i, &j);
      t = rev(t, i, j);
    } else {
      int k;
      fscanf(fin, "%d", &k);
      fprintf(fout, "%d\n", findT(t, k));
    }
  }

  for(int i = 1; i <= t->size; ++i)
    fprintf(fout, "%d ", findT(t, i));

  fclose(fin);
  fclose(fout);
  return 0;
}