Advertisement
Guest User

Untitled

a guest
Jul 28th, 2015
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <string>
  6. #include <string.h>
  7. #include <cstdio>
  8. #include <vector>
  9. #include <map>
  10. #include <set>
  11. #include <cstring>
  12. #include <queue>
  13. #include <bitset>
  14. #include <queue>
  15. #include <unordered_map>
  16.  
  17.  
  18. using namespace std;
  19.  
  20.  
  21. struct node
  22. {
  23.     int l, r, p, x;
  24. };
  25.  
  26.  
  27. int uk = 0;
  28. int last = 0;
  29. node d[11000001];
  30. int n;
  31.  
  32.  
  33. void update(int v) {
  34.     d[v].p = d[d[v].l].p + d[d[v].r].p + 1;
  35. }
  36.  
  37.  
  38. int clone(int v) {
  39.     uk++;
  40.     int a = uk;
  41.     d[a] = d[v];
  42.     return a;
  43. }
  44.  
  45.  
  46. void split(int v, int x, int &l, int &r) {
  47.     if (v == 0) {
  48.         l = 0; r = 0;
  49.         return;
  50.     }
  51.     if (x == 0) {
  52.         l = 0;
  53.         r = v;
  54.         return;
  55.     }
  56.     int a = clone(v);
  57.     if (x >= d[d[v].l].p + 1) {
  58.         split(d[a].r, x - d[d[v].l].p - 1, d[a].r, r);
  59.         l = a;
  60.         update(a);
  61.     } else {
  62.         split(d[a].l, x, l, d[a].l);
  63.         r = a;
  64.         update(a);
  65.     }
  66. }
  67.  
  68.  
  69. int goodrand() {
  70.     return (rand() << 15) + rand();
  71. }
  72.  
  73.  
  74. int merge(int l, int r) {
  75.     if (l == 0) {
  76.         return r;
  77.     }
  78.     if (r == 0) {
  79.         return l;
  80.     }
  81.     if (goodrand() % (d[l].p + d[r].p) < d[l].p) {
  82.         int a = clone(l);
  83.         d[a].r = merge(d[a].r, r);
  84.         update(a);
  85.         return a;
  86.     } else {
  87.         int a = clone(r);
  88.         d[a].l = merge(l, d[a].l);
  89.         update(a);
  90.         return a;
  91.     }
  92. }
  93.  
  94.  
  95. int kk = 0;
  96.  
  97.  
  98. void vivedi(int v) {
  99.     if (v == 0) {
  100.         return;
  101.     }
  102.     vivedi(d[v].l);
  103.     printf("%d\n", d[v].x);
  104.     vivedi(d[v].r);
  105. }
  106.  
  107. int go(int v, int t) {
  108.     if (v == 0) {
  109.         return 0;
  110.     }
  111.     int a = clone(v);
  112.     d[a].x = last + t + d[d[a].l].p + 1;
  113.     d[a].l = go(d[a].l, t);
  114.     d[a].r = go(d[a].r, t + d[d[a].l].p + 1);
  115.     return a;
  116. }
  117.  
  118.  
  119. int gh = 0;
  120. node d1[200002];
  121.  
  122.  
  123. int perestr(int v) {
  124.     if (v == 0) {
  125.         return 0;
  126.     }
  127.     gh++;
  128.     int a = gh;
  129.     d1[a] = d[v];
  130.     d1[a].l = perestr(d[v].l);
  131.     d1[a].r = perestr(d[v].r);
  132.     return a;
  133. }
  134.  
  135.  
  136. int main() {
  137.     int q;
  138.     cin >> n >> q;
  139.     // n = 200000;
  140.     // q = 200000;
  141.     int root = 0;
  142.     uk = n;
  143.     for (int i = 0; i < n; i++) {
  144.         int a = i + 1;
  145.         d[i + 1].p = 1;
  146.         d[i + 1].x = a;
  147.         root = merge(root, i + 1);
  148.     }
  149.     last = n;
  150.     for (int i1 = 0; i1 < q; i1++) {
  151.         if (i1 % 10000 == 1) {
  152.             gh = 0;
  153.             root = perestr(root);
  154.             uk = n;
  155.             for (int j = 1; j <= n; j++) {
  156.                 d[j] = d1[j];
  157.             }
  158.         }
  159.         string s;
  160.         cin >> s;
  161.         if (s == "f") {
  162.             int i, j, k;
  163.             scanf("%d %d %d", &i, &j, &k);
  164.             if (i == j) {
  165.                 continue;
  166.             }
  167.             if ((i > j || abs(i - j) >= k)) {
  168.                 int root1 = clone(root);
  169.                 int c, d1;
  170.                 split(root, i - 1, c, d1);
  171.                 int g, h;
  172.                 split(d1, k, g, h);
  173.                 int c1, d11;
  174.                 split(root1, j - 1, c1, d11);
  175.                 int g1, h1;
  176.                 split(d11, k, g1, h1);
  177.                 root1 = merge(c1, g);
  178.                 root1 = merge(root1, h1);
  179.                 root = clone(root1);
  180.             } else {
  181.                 //cout << "hh" << endl;
  182.                 int root1 = clone(root);
  183.             //  vivedi(root);
  184.         //      cout << "opa" << endl;
  185.                 int a, b, a1, b1;
  186.                 split(root, i - 1, a, b);
  187.                 int root2 = clone(b);
  188.                 int c, dd;
  189.                 split(root2, j - i, c, dd);
  190.                 split(root1, j - 1, a1, b1);
  191.                 int e, f;
  192.                 split(b1, k, e, f);
  193.                 root1 = a1;
  194.                 int l = k / (j - i);
  195.                 int g = k - l * (j - i);
  196.                 int h = clone(c);
  197.                 int t, p;
  198.                 split(h, g, t, p);
  199.                 vector<int> v;
  200.                 while (l > 0) {
  201.                     v.push_back((l & 1));
  202.                     l = (l >> 1);
  203.                 }
  204.                 reverse(v.begin(), v.end());
  205.                 int cc1 = 0;
  206.                 int v1 = (int)v.size();
  207.                 for (int j1 = 0; j1 < v1; j1++) {
  208.                     if (v[j1] == 1) {
  209.                         cc1 = merge(cc1, clone(c));
  210.                     }
  211.                     if (j1 != v1 - 1) {
  212.                         cc1 = merge(cc1, cc1);
  213.                     }
  214.                 }
  215.                 root1 = merge(root1, cc1);
  216.                 root1 = merge(root1, t);
  217.                 root1 = merge(root1, f);
  218.                 root = clone(root1);
  219.             }
  220.             continue;
  221.         }
  222.         if (s == "x") {
  223.             int a, b;
  224.             scanf("%d %d", &a, &b);
  225.             int c, d1;
  226.             split(root, a - 1, c, d1);
  227.             int e, f;
  228.             split(d1, b - a + 1, e, f);
  229.             e = go(e, 0);
  230.             last += b - a + 1;
  231.             root = merge(c, e);
  232.             root = merge(root, f);
  233.             continue;
  234.         }
  235.         int i, j, k;
  236.         scanf("%d %d %d", &i, &j, &k);
  237.         if (i == j) {
  238.             continue;
  239.         }
  240.         swap(i, j);
  241.         if ((i < j || abs(i - j) >= k)) {
  242.             i = i - k + 1;
  243.             j = j - k + 1;
  244.             int root1 = clone(root);
  245.             int c, d1;
  246.             split(root, i - 1, c, d1);
  247.             int g, h;
  248.             split(d1, k, g, h);
  249.             int c1, d11;
  250.             split(root1, j - 1, c1, d11);
  251.             int g1, h1;
  252.             split(d11, k, g1, h1);
  253.             root1 = merge(c1, g);
  254.             root1 = merge(root1, h1);
  255.             root = clone(root1);
  256.         } else {
  257.             int root1 = clone(root);
  258.             int a, b, a1, b1;
  259.             split(root, i, a, b);
  260.             int root2 = clone(a);
  261.             int c, dd;
  262.             split(root2, j, dd, c);
  263.             split(root1, j, a1, b1);
  264.             int e, f;
  265.             split(a1, j - k, e, f);
  266.             root1 = b1;
  267.             int l = k / (i - j);
  268.             int g = k - l * (i - j);
  269.             int h = clone(c);
  270.             int t, p;
  271.             split(h, i - j - g, t, p);
  272.             vector<int> v;
  273.             while (l > 0) {
  274.                 v.push_back((l & 1));
  275.                 l = (l >> 1);
  276.             }
  277.             reverse(v.begin(), v.end());
  278.             int cc1 = 0;
  279.             int v1 = (int)v.size();
  280.             for (int j1 = 0; j1 < v1; j1++) {
  281.                 if (v[j1] == 1) {
  282.                     cc1 = merge(cc1, clone(c));
  283.                 }
  284.                 if (j1 != v1 - 1) {
  285.                     cc1 = merge(cc1, cc1);
  286.                 }
  287.             }
  288.             root1 = merge(cc1, root1);
  289.             root1 = merge(p, root1);
  290.             root1 = merge(e, root1);
  291.             root = clone(root1);
  292.         }
  293.     }
  294.     vivedi(root);
  295.     return 0;
  296. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement