Advertisement
Ser1ousSAM

cool

Mar 28th, 2022
1,071
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.76 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <vector>
  4. #include<string>
  5. using namespace std;
  6. const int64_t INVALID = -(1e18);
  7.  
  8. struct Node
  9. {
  10.     int l;
  11.     int r;
  12.     int64_t x;
  13.     int64_t y;
  14.     void node(int64_t xx,int64_t yy,int ll,int rr)
  15.     {
  16.         l = ll;
  17.         r =rr;
  18.         y =yy;
  19.         x = xx;
  20.     }
  21. };
  22.  
  23.  
  24. vector<Node> graph;
  25.  
  26. int create(int64_t x,int64_t y,int l,int r)
  27. {
  28.     Node a;
  29.     a.node(x,y,l,r);
  30.     graph.push_back(a);
  31.     return graph.size()-1;
  32. }
  33.  
  34. int merges(int indL,int indR)
  35. {
  36.     if(indL == -1)
  37.         return indR;
  38.     if(indR == -1)
  39.         return indL;
  40.     if(graph[indL].y > graph[indR].y)
  41.     {
  42.         graph[indL].r = merges(graph[indL].r, indR);
  43.         return indL;
  44.     }
  45.     else
  46.     {
  47.         graph[indR].l = merges(indL,graph[indR].l);
  48.         return indR;
  49.     }
  50. }
  51.  
  52. pair<int,int> split(int indT,int64_t x0)
  53. {
  54.     if(indT == -1)
  55.         return make_pair(-1,-1);
  56.     if(graph[indT].x <= x0)
  57.     {
  58.         pair<int,int> p = split(graph[indT].r, x0);
  59.         graph[indT].r = p.first;
  60.         return make_pair(indT,p.second);
  61.     }
  62.     else
  63.     {
  64.         pair<int,int> p = split(graph[indT].l, x0);
  65.         graph[indT].l = p.second;
  66.         return make_pair(p.first,indT);
  67.     }
  68.  
  69. }
  70.  
  71. int64_t leftE(int indT)
  72. {
  73.     int yk = indT;
  74.     while(graph[yk].l != -1)
  75.     {
  76.         yk  =graph[yk].l;
  77.     }
  78.     return graph[yk].x;
  79. }
  80.  
  81. int64_t rightE(int indT)
  82. {
  83.     int yk = indT;
  84.     while(yk != -1)
  85.     {
  86.         if(graph[yk].r != -1)
  87.             yk  =graph[yk].r;
  88.         else
  89.             break;
  90.     }
  91.     return graph[yk].x;
  92. }
  93.  
  94. int add(int indT,int64_t x,int64_t y)
  95. {
  96.     pair<int,int> p = split(indT, x);
  97.     pair<int,int> p2 = split(p.first, x-1);
  98.     return merges(merges(p2.first,create(x,y,-1,-1)),p.second);
  99. }
  100.  
  101. int removes(int indT,int64_t x)
  102. {
  103.     pair<int,int> p = split(indT, x);
  104.     pair<int,int> p2 = split(p.first, x-1);
  105.     return merges(p2.first,p.second);
  106. }
  107.  
  108. pair<bool,int> finds(int indT,int64_t x)
  109. {
  110.     pair<int,int> p = split(indT, x);
  111.     pair<int,int> p2 = split(p.first, x-1);
  112.     return make_pair(p2.second != -1,merges(merges(p2.first,p2.second),p.second));
  113. }
  114.  
  115. pair<int64_t,int> next(int indT,int64_t x)
  116. {
  117.     pair<int,int> p = split(indT, x);
  118.     if(p.second == -1)
  119.         return make_pair(INVALID,merges(p.first,p.second));
  120.     int ans = leftE(p.second);
  121.     return make_pair(ans,merges(p.first,p.second));
  122. }
  123. pair<int64_t,int> prev(int indT,int64_t x)
  124. {
  125.     pair<int,int> p = split(indT, x-1);
  126.     if(p.first == -1)
  127.         return make_pair(INVALID,merges(p.first,p.second));
  128.     int ans = rightE(p.first);
  129.     return make_pair(ans,merges(p.first,p.second));
  130. }
  131.  
  132. int main()
  133. {
  134.     string s;
  135.     int indT = -1;
  136.     while(cin >> s)
  137.     {
  138.         int64_t x;
  139.         cin >> x;
  140.         if(s == "insert")
  141.         {
  142.             indT = add(indT,x,rand());
  143.         }
  144.         if(s == "delete")
  145.         {
  146.             indT = removes(indT,x);
  147.         }
  148.         if(s == "exists")
  149.         {
  150.             pair<bool,int> f = finds(indT,x);
  151.             indT = f.second;
  152.             if(f.first)
  153.             {
  154.                 cout << "true\n";
  155.             }
  156.             else
  157.                 cout << "false\n";
  158.         }
  159.         if(s == "next")
  160.         {
  161.             pair<int64_t,int> p = next(indT, x);
  162.             indT = p.second;
  163.             if(p.first == INVALID)
  164.                 cout << "none\n";
  165.             else
  166.                 cout << p.first << "\n";
  167.         }
  168.         if(s == "prev")
  169.         {
  170.             pair<int64_t,int> p = prev(indT, x);
  171.             indT = p.second;
  172.             if(p.first == INVALID)
  173.                 cout << "none\n";
  174.             else
  175.                 cout << p.first << "\n";
  176.         }
  177.     }
  178.     return 0;
  179. }
  180.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement