Cod sursa(job #2543405)

Utilizator DavidLDavid Lauran DavidL Data 11 februarie 2020 09:21:27
Problema Zeap Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.06 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fi("zeap.in");
ofstream fo("zeap.out");

struct Treap {
   int val, priority;
   Treap *left, *right;

   Treap(int val, int priority, Treap *left, Treap *right) {
      this->val = val;
      this->priority = priority;
      this->left = left;
      this->right = right;
   }
} *T, *nil;

char A[50];

int getRandom() {
   return rand() % 10000 * 10000 + rand() % 10000;
}

void rotToRight(Treap *&nod) {
   Treap *t = nod->left;
   nod->left = t->right; t->right = nod;
   nod = t;
}

void rotToLeft(Treap *&nod) {
   Treap *t = nod->right;
   nod->right = t->left; t->left = nod;
   nod = t;
}

void balans(Treap *&nod) {
   if (nod == nil)
      return;
   if (nod->left->priority > nod->priority)
      rotToRight(nod);
   else if (nod->right->priority > nod->priority)
      rotToLeft(nod);
}

void baga(Treap *&nod, int val) {
   if (nod == nil) {
      nod = new Treap(val, getRandom(), nil, nil);
      return;
   }

   if (val < nod->val) {
      baga(nod->left, val);
   }
   else if (val > nod->val) {
      baga(nod->right, val);
   }

   balans(nod);
}

void scoate(Treap *&nod, int val) {
   if (nod == nil)
      return;

   if (nod->val == val) {
      if (nod->left == nil && nod->right == nil) {
         delete nod;
         nod = nil;
      }
      else if (nod->left->priority > nod->right->priority) {
         rotToRight(nod);
      }
      else {
         rotToLeft(nod);
      }
      scoate(nod, val);
   }
   else {
      if (val <= nod->val)
         scoate(nod->left, val);
      else
         scoate(nod->right, val);
   }
}

bool cauta(Treap *nod, int val) {
   if (nod == nil)
      return 0;

   if (nod->val == val)
      return 1;
   else if (val < nod->val)
      return cauta(nod->left, val);
   else
      return cauta(nod->right, val);
}

int getMax(Treap *nod) {
   if (nod->right != nil)
      return getMax(nod->right);
   else
      return nod->val;
}

int getMin(Treap *nod) {
   if (nod->left != nil)
      return getMin(nod->left);
   else
      return nod->val;
}

bool amDoua() {
   if (T == nil)
      return 0;
   return T->left != nil || T->right != nil;
}

int main()
{
   T = nil = new Treap(0, 0, NULL, NULL);

   while (fi.getline(A + 1, 100)) {
      if (A[1] != 'M') {
         int x = 0;
         for (int i = 3; i <= strlen(A + 1); i++)
            x = x * 10 + (A[i] - '0');

         if (A[1] == 'I') {
            baga(T, x);
         }
         else if (A[1] == 'S') {
            if (cauta(T, x) == 0)
               fo << -1 << "\n";
            else
               scoate(T, x);
         }
         else {
            fo << cauta(T, x) << "\n";
         }
      }
      else {
         if (!amDoua()) {
            fo << -1 << "\n";
         }
         if (A[2] == 'A') {
            //diferenta maxima
            fo << getMax(T) - getMin(T) << "\n";
         }
         else {
            // diferenta minima

         }
      }
   }

   return 0;
}