Advertisement
skimono

Untitled

May 26th, 2023
866
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.20 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <string>
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <stack>
  9. #include <iomanip>
  10. #include <fstream>
  11. #include <string>
  12. #include <set>
  13. #include <deque>
  14. #include <queue>
  15. #include <map>
  16. #include <bitset>
  17. #include <random>
  18. #include <list>
  19. #include <unordered_map>
  20. #include <unordered_set>
  21. #include <cassert>
  22.  
  23. using namespace std;
  24.  
  25. typedef long long ll;
  26. typedef unsigned long long ull;
  27. typedef long double ld;
  28. typedef string str;
  29. //typedef __int128 ultraint;
  30. #define endl "\n"
  31. #define sqrt sqrtl
  32. #define F first
  33. #define S second
  34. #define all(vc666) vc666.begin(), vc666.end()
  35. #define pow binpow
  36. //#define Vec Point
  37.  
  38. const ll inf = (ll)1e18 + 7;
  39. ld EPS = 1e-9;
  40. ld Pi = 3.1415926535897932384;
  41.  
  42. const ll max_sz = 1e5 + 1;
  43.  
  44. ll binpow(ll a, ll n) {
  45.     ll res = 1;
  46.     while (n) {
  47.         if (n & 1) {
  48.             res *= a;
  49.         }
  50.         a *= a;
  51.         n >>= 1;
  52.     }
  53.     return res;
  54. }
  55.  
  56. struct Node {
  57.     ll priority;
  58.     ll value, size = 1, sum = 0, add = 0;
  59.     bool rev = false, swp = false;
  60.     Node* l = nullptr;
  61.     Node* r = nullptr;
  62.     Node* pr = nullptr;
  63.     Node(ll value) : priority(rand()), value(value), sum(value) {}
  64. } *root = nullptr;
  65.  
  66. Node* sup[max_sz];
  67.  
  68. struct dd2 {
  69.     ll getSize(Node* n) {
  70.         return n ? n->size : 0;
  71.     }
  72.     ll getSum(Node* n) {
  73.         return n ? n->sum + n->add * n->size : 0;
  74.     }
  75.     void push(Node* n) {
  76.         if (n) {
  77.             if (n->add != 0) {
  78.                 n->value += n->add;
  79.                 n->sum += n->add;
  80.                 if (n->l) {
  81.                     n->l->add += n->add;
  82.                 }
  83.                 if (n->r) {
  84.                     n->r->add += n->add;
  85.                 }
  86.                 n->add = 0;
  87.             }
  88.             if (n->rev) {
  89.                 swap(n->l, n->r);
  90.                 if (n->l) {
  91.                     n->l->rev ^= 1;
  92.                 }
  93.                 if (n->r) {
  94.                     n->r->rev ^= 1;
  95.                 }
  96.                 n->rev = false;
  97.             }
  98.         }
  99.     }
  100.     void update(Node* n) {
  101.         if (n) {
  102.             n->size = getSize(n->l) + 1 + getSize(n->r);
  103.             n->sum = getSum(n->l) + getSum(n->r) + n->value;
  104.             if (n->l) {
  105.                 n->l->pr = n;
  106.             }
  107.             if (n->r) {
  108.                 n->r->pr = n;
  109.             }
  110.         }
  111.     }
  112.     Node* merge(Node* a, Node* b) {
  113.         push(a);
  114.         push(b);
  115.         if (!a || !b) {
  116.             return a ? a : b;
  117.         }
  118.         if (a->priority > b->priority) {
  119.             b->pr = a;
  120.             a->r = merge(a->r, b);
  121.             update(a);
  122.             return a;
  123.         }
  124.         else {
  125.             a->pr = b;
  126.             b->l = merge(a, b->l);
  127.             update(b);
  128.             return b;
  129.         }
  130.     }
  131.     void split(Node* n, ll k, Node*& a, Node*& b) {
  132.         push(n);
  133.         if (!n) {
  134.             a = b = nullptr;
  135.             return;
  136.         }
  137.         if (getSize(n->l) < k) {
  138.             split(n->r, k - getSize(n->l) - 1, n->r, b);
  139.             a = n;
  140.         }
  141.         else {
  142.             split(n->l, k, a, n->l);
  143.             b = n;
  144.         }
  145.         update(a);
  146.         update(b);
  147.     }
  148.     ll get(ll index) {
  149.         Node* less, * equal, * greater;
  150.         split(root, index, less, greater);
  151.         split(greater, 1, equal, greater);
  152.         ll result = equal->value;
  153.         root = merge(merge(less, equal), greater);
  154.         return result;
  155.     }
  156.     Node* getpos(ll index) {
  157.         Node* less, * equal, * greater;
  158.         split(root, index, less, greater);
  159.         split(greater, 1, equal, greater);
  160.         Node* res = equal;
  161.         root = merge(merge(less, equal), greater);
  162.         return res;
  163.     }
  164.     ll getid(Node* n) {
  165.         return getSize(n->l);
  166.     }
  167.     void push_back(ll value) {
  168.         root = merge(root, new Node(value));
  169.     }
  170.     void push_front(ll value) {
  171.         root = merge(new Node(value), root);
  172.     }
  173.     void insert(ll index, ll value) {
  174.         Node* less, * greater;
  175.         split(root, index, less, greater);
  176.         root = merge(merge(less, new Node(value)), greater);
  177.     }
  178.     void erase(ll index) {
  179.         Node* less, * equal, * greater;
  180.         split(root, index, less, greater);
  181.         split(greater, 1, equal, greater);
  182.         root = merge(less, greater);
  183.     }
  184.     void erase(ll l, ll r) {
  185.         Node* less, * equal, * greater;
  186.         split(root, l, less, greater);
  187.         split(greater, r - l + 1, equal, greater);
  188.         root = merge(less, greater);
  189.     }
  190.     void add(ll l, ll r,ll boost) {
  191.         Node* less, * equal, * greater;
  192.         split(root, l, less, greater);
  193.         split(greater, r - l + 1, equal, greater);
  194.         equal->add += boost;
  195.         root = merge(merge(less, equal), greater);
  196.     }
  197.     void revolve(ll l, ll r, ll t) {
  198.         Node* less, * equal, * greater;
  199.         split(root, l, less, greater);
  200.         split(greater, r - l + 1, equal, greater);
  201.         ll len = getSize(equal);
  202.         t %= len;
  203.         Node *a, *b;
  204.         split(equal, len - t, a, b);
  205.         equal = merge(b, a);
  206.         root = merge(merge(less, equal), greater);
  207.     }
  208.     ll size() {
  209.         return getSize(root);
  210.     }
  211.     ll getSum(ll l, ll r) {
  212.         Node* less, * equal, * greater;
  213.         split(root, l, less, greater);
  214.         split(greater, r - l + 1, equal, greater);
  215.         ll result = getSum(equal);
  216.         root = merge(merge(less, equal), greater);
  217.         return result;
  218.     }
  219.     void reverse(ll l, ll r) {
  220.         Node* less, * equal, * greater;
  221.         split(root, l, less, greater);
  222.         split(greater, r - l + 1, equal, greater);
  223.         equal->rev ^= true;
  224.         root = merge(merge(less, equal), greater);
  225.     }
  226.     void swapper(ll l1, ll r1, ll l2, ll r2) {
  227.         Node* less, * equal, * greater, * less2, * equal2;
  228.         split(root, l1, less, greater);
  229.         split(greater, r1 - l1 + 1, equal, greater);
  230.         split(greater, l2 - r1 - 1, less2, greater);
  231.         split(greater, r2 - l2 + 1, equal2, greater);
  232.         root = merge(merge(less, merge(equal2, merge(less2, equal))), greater);
  233.     }
  234.     pair <ll, Node*> next(Node* n) {
  235.         Node* ans = nullptr;
  236.         if (n) {
  237.             if (n->r) {
  238.                 n = n->r;
  239.                 while (n) {
  240.                     ans = n;
  241.                     n = n->l;
  242.                 }
  243.                 return { ans->value,ans };
  244.             }
  245.             else {
  246.                 ll last_val = n->value;
  247.                 n = n->pr;
  248.                 while (n) {
  249.                     if (n->l && n->l->value == last_val) {
  250.                         return { n->value,n };
  251.                     }
  252.                     last_val = n->value;
  253.                     n = n->pr;
  254.                 }
  255.                 return { -1,n };
  256.             }
  257.         }
  258.         else {
  259.             return { -1,n };
  260.         }
  261.     }
  262. };
  263.  
  264. signed main() {
  265. #ifdef _DEBUG
  266.     freopen("in.txt", "r", stdin);
  267.     freopen("out.txt", "w", stdout);
  268. #endif
  269.     ios_base::sync_with_stdio(0);
  270.     cin.tie(NULL);
  271.     cout.tie(NULL);
  272.     ll t = 1;
  273.     //cin >> t;
  274.     while (t--) {
  275.         ll n, m, i, j, l1, r1, l2, r2, pos, x;
  276.         cin >> n >> m;
  277.         dd2 tree;
  278.         for (i = 0; i < n; i++) {
  279.             cin >> j;
  280.             tree.push_back(j);
  281.             sup[j] = tree.getpos(i);
  282.         }
  283.         for (i = 0; i < m; i++) {
  284.             cin >> j;
  285.             if (j == 1) {
  286.                 cin >> l1 >> r1 >> l2 >> r2;
  287.                 tree.swapper(l1 - 1, r1 - 1, l2 - 1, r2 - 1);
  288.             }
  289.             else {
  290.                 cin >> x;
  291.                 Node* it = sup[x];
  292.                 for (j = 0; j < 3; j++) {
  293.                     pair <ll, Node*> res = tree.next(it);
  294.                     cout << res.first << " ";
  295.                     it = res.second;
  296.                 }
  297.                 cout << endl;
  298.             }
  299.         }
  300.     }
  301. }
  302. //痛みを受け入れる。 痛みを知っています。 痛みを感じる。 痛みを参照してください。 真の痛みを知らなければ、真の世界を理解することは不可能です。 今、あなたは痛みを知るでしょう。 神の罰!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement