Advertisement
Guest User

Treap

a guest
Nov 28th, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. const long long INF = 1e10;
  8.  
  9. struct Treap
  10. {
  11.     long long x, y, mn, sz;
  12.     bool reversed;
  13.     Treap *l, *r;
  14.     Treap(long long x) : x(x), y(rand()), l(NULL), r(NULL), sz(1), mn(x), reversed(false) {}
  15.     Treap() {}
  16. };
  17.  
  18. long long get_min(Treap *T)
  19. {
  20.     if (T == NULL)
  21.         return INF;
  22.     return T -> mn;
  23. }
  24.  
  25. long long get_size(Treap *T)
  26. {
  27.     if (T == NULL)
  28.         return 0;
  29.     return T -> sz;
  30. }
  31.  
  32. void recalc(Treap* T)
  33. {
  34.     if (T == NULL)
  35.         return;
  36.     T -> sz = 1 + get_size(T -> l) + get_size(T -> r);
  37.     T -> mn = min(T -> x, min(get_min(T -> l), get_min(T -> r)));
  38. }
  39.  
  40. void Push(Treap *T)
  41. {
  42.     if (T == NULL) return;
  43.     if (T -> reversed == false) return;
  44.  
  45.     swap(T -> l, T -> r);
  46.     T -> reversed = false;
  47.  
  48.     if (T -> l != NULL) T -> l -> reversed ^= true;
  49.     if (T -> r != NULL) T -> r -> reversed ^= true;
  50. }
  51.  
  52. void Merge(Treap *l, Treap *r, Treap* &T)
  53. {
  54.     Push(l);
  55.     Push(r);
  56.  
  57.     if (l == NULL || r == NULL)
  58.         T = (l == NULL) ? r : l;
  59.     else
  60.         if (l -> y > r -> y)
  61.             Merge(l -> r, r, l -> r), T = l;
  62.         else
  63.             Merge(l, r -> l, r -> l), T = r;
  64.     recalc(T);
  65. }
  66.  
  67. void Split(Treap *T, long long k, Treap* &l, Treap* &r)
  68. {
  69.     Push(T);
  70.  
  71.     if (T == NULL){
  72.         l = r = NULL;
  73.         return;
  74.     }
  75.  
  76.     else
  77.     {
  78.         long long sz = get_size(T -> l);
  79.         if (k > sz)
  80.         {
  81.             l = T;
  82.             Split(T -> r, k - sz - 1, l -> r, r);
  83.         }
  84.         else
  85.         {
  86.             r = T;
  87.             Split(T -> l, k, l, r -> l);
  88.         }
  89.     }
  90.     recalc(l);
  91.     recalc(r);
  92. }
  93.  
  94. void dfs(Treap *T)
  95. {
  96.     if (T != NULL)
  97.     {
  98.         dfs(T -> l);
  99.         cout << T -> x << ' ';
  100.         dfs(T -> r);
  101.     }
  102. }
  103.  
  104. int main()
  105. {
  106.     int n, m;
  107.     cin >> n >> m;
  108.  
  109.     Treap *T = NULL;
  110.  
  111.     for (int i = 0; i < n; ++i)
  112.     {
  113.         int a;
  114.         cin >> a;
  115.         Treap *nT = new Treap(a);
  116.         Merge(T, nT, T);
  117.     }
  118.  
  119.     for (int i = 0; i < m; ++i)
  120.     {
  121.         int a, b, c;
  122.         cin >> a >> b >> c;
  123.         if (a == 1)
  124.         {
  125.             Treap *l, *r, *mid;
  126.             Split(T, c, l, r);
  127.             Split(l, b - 1, l, mid);
  128.             mid -> reversed ^= true;
  129.             Merge(l, mid, l);
  130.             Merge(l, r, T);
  131.  
  132.             dfs(T);
  133.             cout << endl;
  134.         }
  135.         else
  136.         {
  137.             Treap *l, *r, *mid;
  138.             Split(T, c, l, r);
  139.             Split(l, b - 1, l, mid);
  140.             cout << mid -> mn << endl;
  141.             Merge(l, mid, l);
  142.             Merge(l, r, T);
  143.         }
  144.     }
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement