Advertisement
Guest User

Untitled

a guest
Dec 9th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. /*
  2.  H. Переместить в начало
  3. */
  4. #include <bits/stdc++.h>
  5.  
  6. using namespace std;
  7.  
  8. // Декартово дерево
  9. struct item
  10. {
  11.     item() {}
  12.     item(int key, int priority) : key(key), priority(priority) {}
  13.     int key, priority;
  14.     int count = 1;
  15.     item* l = nullptr;
  16.     item* r = nullptr;
  17. };
  18.  
  19. int getCount(const item* t)
  20. {
  21.     return t ? t->count : 0;
  22. }
  23.  
  24. void updateCount(item* t)
  25. {
  26.     if (t)
  27.         t->count = getCount(t->l) + getCount(t->r) + 1;
  28. }
  29.  
  30. void split(item* t, const int key, item* &l, item* &r)
  31. {
  32.     if (!t)
  33.         l = r = nullptr;
  34.     else if (getCount(t->l) >= key)
  35.     {
  36.         split(t->l, key, l, t->l);
  37.         r = t;
  38.     }
  39.     else
  40.     {
  41.         split(t->r, key - getCount(t->l) - 1, t->r, r);
  42.         l = t;
  43.     }
  44.     updateCount(t);
  45. }
  46.  
  47. void insert(item* &t, item* it)
  48. {
  49.     if (!t)
  50.         t = it;
  51.     else if (it->priority > t->priority)
  52.     {
  53.         split(t, it->key, it->l, it->r);
  54.         t = it;
  55.     }
  56.     else
  57.         insert(it->key < t->key ? t->l : t->r, it);
  58.     updateCount(t);
  59. }
  60.  
  61. item* merge(item* l, item* r)
  62. {
  63.     if (!l || !r)
  64.         return l ? l : r;
  65.     if (l->priority > r->priority)
  66.     {
  67.         l->r = merge(l->r, r);
  68.         updateCount(l);
  69.         return l;
  70.     }
  71.     r->l = merge(l, r->l);
  72.     updateCount(r);
  73.     return r;
  74. }
  75.  
  76. int main()
  77. {
  78.     ios_base::sync_with_stdio(0);
  79.     cin.tie(0);
  80.     cout.tie(0);
  81.  
  82.     // будем выбирать приоритеты случайно с равномерным распределением
  83.     random_device rd;
  84.     mt19937 gen(rd());
  85.     uniform_int_distribution<> dis(1, 1000000);
  86.     item* treap = nullptr;  // наше декартово дерево
  87.  
  88.     int n = 0;
  89.     int m = 0;
  90.     cin >> n >> m;
  91.  
  92.     for (int i = 1; i <= n; i++)
  93.     {
  94.         item* newItem = new item(i, dis(gen));
  95.         insert(treap, newItem);
  96.     }
  97.  
  98.     int l = 0;
  99.     int r = 0;
  100.     for (int i = 0; i < m; i++)
  101.     {
  102.         cin >> l >> r;
  103.         l--;  // смещение нумерации
  104.         r--;
  105.         item* left;
  106.         item* tmp;
  107.         item* middle;
  108.         item* right;
  109.         split(treap, l, left, tmp);
  110.         split(tmp, r - l + 1, middle, right);
  111.         left = merge(middle, left);
  112.         treap = merge(left, right);
  113.     }
  114.  
  115.     for (int i = 0; i < n; i++)
  116.     {
  117.         item* left;
  118.         item* right;
  119.         split(treap, 1, left, right);
  120.         cout << left->key << ' ';
  121.         treap = right;
  122.     }
  123.  
  124.     return 0;
  125. }
  126.  
  127. /*
  128. 6 3
  129. 2 4
  130. 3 5
  131. 2 2
  132.  
  133. 1 4 5 2 3 6
  134. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement