Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cassert>
  5. #include <vector>
  6. #include <ctime>
  7.  
  8. using namespace std;
  9.  
  10. struct Treap {
  11.     long long val;
  12.     int len;
  13.     Treap *left, *right;
  14.     int prior;
  15.    
  16.     Treap (long long a = 0):
  17.     val(a), len(1), left(NULL), right(NULL), prior(rand()) {}
  18. };
  19.  
  20. void update(Treap *x) {
  21.     if (x == NULL)
  22.     return;
  23.     x->len = ((x->left) ? x->left->len : 0) + ((x->right) ? x->right->len : 0) + 1;
  24. }
  25.  
  26. Treap *merge(Treap *l, Treap *r) {
  27.     if (l == NULL)
  28.     return r;
  29.     if (r == NULL)
  30.     return l;
  31.     if (l->prior < r->prior) {
  32.         r->left = merge(l, r->left);
  33.         update(r);
  34.         return r;
  35.     } else {
  36.         l->right = merge(l->right, r);
  37.         update(l);
  38.         return l;
  39.     }
  40. }
  41.  
  42. void split(Treap *root, Treap *&l, Treap *&r, int sz_left) {
  43.     if (root == NULL) {
  44.         l = r = NULL;
  45.         return;
  46.     }
  47.     int lsz = (root->left) ? root->left->len : 0;
  48.     if (sz_left <= lsz) {
  49.         Treap *tmp_l, *tmp_r;
  50.         split(root->left, tmp_l, tmp_r, sz_left);
  51.         root->left = tmp_r;
  52.         l = tmp_l,
  53.         r = root;
  54.     } else {
  55.         Treap *tmp_l, *tmp_r;
  56.         split(root->right, tmp_l, tmp_r, sz_left - lsz - 1);
  57.         root->right = tmp_l;
  58.         l = root,
  59.         r = tmp_r;
  60.     }
  61.     update(root);
  62. }
  63.  
  64. void add(Treap *&root, int pos, int val) {
  65.     Treap *z = new Treap(val), *l, *r;
  66.     split(root, l, r, pos);
  67.     root = merge(merge(l, z), r);
  68. }
  69.  
  70. void print(Treap *root) {
  71.     if (root == NULL)
  72.     return;
  73.     print(root->left);
  74.     cout << root->val << " ";
  75.     print(root->right);
  76. }
  77.  
  78. Treap *root = NULL;
  79.  
  80. int main() {
  81.    
  82.     int n, m; cin >> n >> m;
  83.     int l, r;
  84.     Treap *left, *mid, *right;
  85.     for (int i = 0; i < n; i++){
  86.         add(root, i, i + 1);
  87.     }
  88.     for (int i = 0; i < m; i++) {
  89.         cin >> l >> r;
  90.         l--;
  91.         r--;
  92.         split(root, left, right, r + 1);
  93.         split(left, left, mid, l);
  94.         root = merge(merge(mid, left), right);
  95.     }
  96.     print(root);
  97.     cout << '\n';
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement