Cod sursa(job #1509309)

Utilizator vladrochianVlad Rochian vladrochian Data 23 octombrie 2015 18:23:16
Problema Secv8 Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;

ifstream fin("secv8.in");
ofstream fout("secv8.out");

struct Node {
  Node(int value, int priority, int size, Node *ls, Node *rs)
      : value(value), priority(priority),
        size(size), rev(false), ls(ls), rs(rs) {}

  int value, priority, size;
  bool rev;
  Node *ls, *rs;
} *treap, *nil = new Node(0, -1, 0, nullptr, nullptr);

inline void GetSize(Node *node) {
  node->size = node->ls->size + node->rs->size + 1;
}

void RotateLeft(Node *&node) {
  Node *aux = node->rs;
  node->rs = aux->ls;
  aux->ls = node;
  node = aux;

  GetSize(node->ls);
  GetSize(node);
}

void RotateRight(Node *&node) {
  Node *aux = node->ls;
  node->ls = aux->rs;
  aux->rs = node;
  node = aux;

  GetSize(node->rs);
  GetSize(node);
}

void Balance(Node *&node) {
  if (node->ls->priority > node->priority)
    RotateRight(node);
  else if (node->rs->priority > node->priority)
    RotateLeft(node);
}

void Insert(Node *&node, int pos, int value, int priority) {
  if (node == nil) {
    node = new Node(value, priority, 1, nil, nil);
    return;
  }

  ++node->size;
  if (pos <= node->ls->size + 1)
    Insert(node->ls, pos, value, priority);
  else
    Insert(node->rs, pos - node->ls->size - 1, value, priority);

  Balance(node);
}

int GetValue(Node *node, int pos) {
  if (pos == node->ls->size + 1)
    return node->value;

  if (pos <= node->ls->size)
    return GetValue(node->ls, pos);
  else
    return GetValue(node->rs, pos - node->ls->size - 1);
}

void Erase(Node *&node, int pos) {
  if (pos != node->ls->size + 1) {
    if (pos <= node->ls->size)
      Erase(node->ls, pos);
    else
      Erase(node->rs, pos - node->ls->size - 1);
    --node->size;
    return;
  }

  if (node->ls == nil && node->rs == nil) {
    delete node;
    node = nil;
    return;
  }

  if (node->ls->priority > node->rs->priority) {
    RotateRight(node);
    Erase(node->rs, node->rs->ls->size + 1);
  } else {
    RotateLeft(node);
    Erase(node->ls, node->ls->ls->size + 1);
  }
  --node->size;
}

void Print(Node *node) {
  if (node == nil)
    return;

  Print(node->ls);
  fout << node->value << " ";
  Print(node->rs);
}

int main() {
  srand(time(0));
  treap = nil;
  int t, rev;
  fin >> t >> rev;

  while (t--) {
    char type;
    int x, y;
    fin >> type;
    switch (type) {
      case 'I':
        fin >> x >> y;
        Insert(treap, x, y, rand());
        break;
      case 'A':
        fin >> x;
        fout << GetValue(treap, x) << "\n";
        break;
      case 'R':
        fin >> x >> y;
        break;
      default:
        fin >> x >> y;
        for (int i = x; i <= y; ++i)
          Erase(treap, x);
    }
  }

  Print(treap);
  fout << "\n";
  return 0;
}