Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.85 KB | None | 0 0
  1.    
  2. #include <iostream>
  3. #include <fstream>
  4. #include <ctime>
  5. #include <random>
  6. #include <string>
  7.  
  8. using namespace std;
  9.  
  10. const int INF = 1000000000;
  11.  
  12. class Treap
  13. {
  14. public:
  15.     struct nod
  16.     {
  17.         int mn, mx, difMin;
  18.         int val, priority;
  19.         nod *fiuSt, *fiuDr;
  20.     };
  21.     Treap(nod *root = nullptr)
  22.     {
  23.         this->root = root;
  24.         srand(time(0));
  25.     }
  26.     void Insert(int val)
  27.     {
  28.         Insert(root, rand(), val);
  29.     }
  30.     void Split(int val, Treap &st, Treap &dr)
  31.     {
  32.         nod *retSt, *retDr;
  33.         Split(root, val, retSt, retDr);
  34.         st = Treap(retSt);
  35.         dr = Treap(retDr);
  36.     }
  37.     //that > this
  38.     void Join(Treap &that)
  39.     {
  40.         root = Join(root, that.root);
  41.         that = Treap();
  42.     }
  43.     void Erase(int val)
  44.     {
  45.         Erase(root, val);
  46.     }
  47.     bool Find(int val)
  48.     {
  49.         return Find(root, val);
  50.     }
  51.     int MaxDif()
  52.     {
  53.         return root->mx - root->mn;
  54.     }
  55.     int MinDif()
  56.     {
  57.         return root->difMin;
  58.     }
  59. private:
  60.     void Update(nod * x)
  61.     {
  62.         if(x != nullptr)
  63.         {
  64.             x->mn = x->mx = x->val;
  65.             x->difMin = INF;
  66.             if(x->fiuSt != nullptr)
  67.             {
  68.                 x->mn = min(x->mn, x->fiuSt->mn);
  69.                 x->difMin = min(x->difMin, min(x->fiuSt->difMin, x->val - x->fiuSt->mx));
  70.             }
  71.             if(x->fiuDr != nullptr)
  72.             {
  73.                 x->mx = max(x->mx, x->fiuDr->mx);
  74.                 x->difMin = min(x->difMin, min(x->fiuDr->difMin, x->fiuDr->mn - x->val));
  75.             }
  76.         }
  77.     }
  78.     void Split(nod *current, int val, nod * &st, nod * &dr)
  79.     {
  80.         if(current == nullptr)
  81.             st = dr = nullptr;
  82.         else if(val < current->val)
  83.         {
  84.             dr = current;
  85.             Split(current->fiuSt, val, st, current->fiuSt);
  86.         }
  87.         else
  88.         {
  89.             st = current;
  90.             Split(current->fiuDr, val, current->fiuDr, dr);
  91.         }
  92.         Update(current);
  93.     }
  94.     nod * Join(nod * st, nod * dr)
  95.     {
  96.         if(st == nullptr)
  97.             return dr;
  98.         if(dr == nullptr)
  99.             return st;
  100.         if(st->priority >= dr->priority)
  101.         {
  102.             st->fiuDr = Join(st->fiuDr, dr);
  103.             Update(st);
  104.             return st;
  105.         }
  106.         dr->fiuSt = Join(st, dr->fiuSt);
  107.         Update(dr);
  108.         return dr;
  109.     }
  110.     void Insert(nod * &current, int priority, int val)
  111.     {
  112.         if(current == nullptr || priority > current->priority)
  113.         {
  114.             nod * st, * dr;
  115.             Split(current, val, st, dr);
  116.             current = new nod;
  117.             current->val = val, current->priority = priority;
  118.             current->fiuSt = st, current->fiuDr = dr;
  119.             Update(current);
  120.             return;
  121.         }
  122.         if(val < current->val)
  123.             Insert(current->fiuSt, priority, val);
  124.         else
  125.             Insert(current->fiuDr, priority, val);
  126.         Update(current);
  127.     }
  128.     void Erase(nod * &current, int val)
  129.     {
  130.         if(val == current->val)
  131.         {
  132.             nod * t = current;
  133.             current = Join(current->fiuSt, current->fiuDr);
  134.             delete t;
  135.             Update(current);
  136.             return;
  137.         }
  138.         if(val < current->val)
  139.             Erase(current->fiuSt, val);
  140.         else
  141.             Erase(current->fiuDr, val);
  142.         Update(current);
  143.     }
  144.     bool Find(nod * current, int val)
  145.     {
  146.         if(current == nullptr)
  147.             return false;
  148.         if(val == current->val)
  149.             return true;
  150.         if(val < current->val)
  151.             return Find(current->fiuSt, val);
  152.         return Find(current->fiuDr, val);
  153.     }
  154.     nod * root;
  155. };
  156.  
  157. int main()
  158. {
  159.     ifstream in("zeap.in");
  160.     ofstream out("zeap.out");
  161.     string type;
  162.     int x;
  163.     Treap treap;
  164.     int elem = 0;
  165.     while(in >> type)
  166.     {
  167.         if(type == "I")
  168.         {
  169.             in >> x;
  170.             if(treap.Find(x) == false)
  171.             {
  172.                 treap.Insert(x);
  173.                 elem++;
  174.             }
  175.         }
  176.         else if(type == "S")
  177.         {
  178.             in >> x;
  179.             if(treap.Find(x) == false)
  180.                 out << -1 << "\n";
  181.             else
  182.             {
  183.                 treap.Erase(x);
  184.                 elem--;
  185.             }
  186.         }
  187.         else if(type == "C")
  188.         {
  189.             in >> x;
  190.             out << treap.Find(x) << "\n";
  191.         }
  192.         else if(type == "MAX")
  193.         {
  194.             if(elem >= 2)
  195.                 out << treap.MaxDif() << "\n";
  196.             else
  197.                 out << -1 << "\n";
  198.         }
  199.         else
  200.         {
  201.             if(elem >= 2)
  202.                 out << treap.MinDif() << "\n";
  203.             else
  204.                 out << -1 << "\n";
  205.         }
  206.     }
  207.     in.close();
  208.     out.close();
  209.     return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement