Advertisement
skimono

Dekartach 2

Jul 11th, 2022
998
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.15 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. ll binpow(ll a, ll n) {
  43.     ll res = 1;
  44.     while (n) {
  45.         if (n & 1) {
  46.             res *= a;
  47.         }
  48.         a *= a;
  49.         n >>= 1;
  50.     }
  51.     return res;
  52. }
  53.  
  54. struct dd2 {
  55.     struct Node {
  56.         ll priority;
  57.         ll value, size = 1, minValue, add = 0, rev = 0;
  58.         Node* l = nullptr;
  59.         Node* r = nullptr;
  60.         Node(ll value) : priority(rand()), value(value),minValue(value) {}
  61.     } *root = nullptr;
  62.     ll getSize(Node* n) {
  63.         return n ? n->size : 0;
  64.     }
  65.     ll getMinValue(Node* n) {
  66.         return n ? n->minValue + n->add : inf;
  67.     }
  68.     void push(Node* n) {
  69.         if (n) {
  70.             if (n->add != 0) {
  71.                 n->value += n->add;
  72.                 n->minValue += n->add;
  73.                 if (n->l) {
  74.                     n->l->add += n->add;
  75.                 }
  76.                 if (n->r) {
  77.                     n->r->add += n->add;
  78.                 }
  79.                 n->add = 0;
  80.             }
  81.             if (n->rev) {
  82.                 swap(n->l, n->r);
  83.                 if (n->l) {
  84.                     n->l->rev ^= 1;
  85.                 }
  86.                 if (n->r) {
  87.                     n->r->rev ^= 1;
  88.                 }
  89.                 n->rev = 0;
  90.             }
  91.         }
  92.     }
  93.     void update(Node* n) {
  94.         if (n) {
  95.             n->size = getSize(n->l) + 1 + getSize(n->r);
  96.             n->minValue = min(min(getMinValue(n->l), n->value), getMinValue(n->r));
  97.         }
  98.     }
  99.     Node* merge(Node* a, Node* b) {
  100.         push(a);
  101.         push(b);
  102.         if (!a || !b) {
  103.             return a ? a : b;
  104.         }
  105.         if (a->priority > b->priority) {
  106.             a->r = merge(a->r, b);
  107.             update(a);
  108.             return a;
  109.         }
  110.         else {
  111.             b->l = merge(a, b->l);
  112.             update(b);
  113.             return b;
  114.         }
  115.     }
  116.     void split(Node* n, ll k, Node*& a, Node*& b) {
  117.         push(n);
  118.         if (!n) {
  119.             a = b = nullptr;
  120.             return;
  121.         }
  122.         if (getSize(n->l) < k) {
  123.             split(n->r, k - getSize(n->l) - 1, n->r, b);
  124.             a = n;
  125.         }
  126.         else {
  127.             split(n->l, k, a, n->l);
  128.             b = n;
  129.         }
  130.         update(a);
  131.         update(b);
  132.     }
  133.     ll get(ll index) {
  134.         Node* less, * equal, * greater;
  135.         split(root, index, less, greater);
  136.         split(greater, 1, equal, greater);
  137.         ll result = equal->value;
  138.         root = merge(merge(less, equal), greater);
  139.         return result;
  140.     }
  141.     void push_back(ll value) {
  142.         root = merge(root, new Node(value));
  143.     }
  144.     void push_front(ll value) {
  145.         root = merge(new Node(value), root);
  146.     }
  147.     void insert(ll index, ll value) {
  148.         Node* less, * greater;
  149.         split(root, index, less, greater);
  150.         root = merge(merge(less, new Node(value)), greater);
  151.     }
  152.     void erase(ll index) {
  153.         Node* less, * equal, * greater;
  154.         split(root, index, less, greater);
  155.         split(greater, 1, equal, greater);
  156.         root = merge(less, greater);
  157.     }
  158.     void erase(ll l, ll r) {
  159.         Node* less, * equal, * greater;
  160.         split(root, l, less, greater);
  161.         split(greater, r - l + 1, equal, greater);
  162.         root = merge(less, greater);
  163.     }
  164.     void add(ll l, ll r,ll boost) {
  165.         Node* less, * equal, * greater;
  166.         split(root, l, less, greater);
  167.         split(greater, r - l + 1, equal, greater);
  168.         equal->add += boost;
  169.         root = merge(merge(less, equal), greater);
  170.     }
  171.     void revolve(ll l, ll r, ll t) {
  172.         Node* less, * equal, * greater;
  173.         split(root, l, less, greater);
  174.         split(greater, r - l + 1, equal, greater);
  175.         ll len = getSize(equal);
  176.         t %= len;
  177.         Node *a, *b;
  178.         split(equal, len - t, a, b);
  179.         equal = merge(b, a);
  180.         root = merge(merge(less, equal), greater);
  181.     }
  182.     ll size() {
  183.         return getSize(root);
  184.     }
  185.     ll minValue(ll l, ll r) {
  186.         Node* less, * equal, * greater;
  187.         split(root, l, less, greater);
  188.         split(greater, r - l + 1, equal, greater);
  189.         ll result = getMinValue(equal);
  190.         root = merge(merge(less, equal), greater);
  191.         return result;
  192.     }
  193.     void reverse(ll l, ll r) {
  194.         Node* less, * equal, * greater;
  195.         split(root, l, less, greater);
  196.         split(greater, r - l + 1, equal, greater);
  197.         equal->rev ^= 1;
  198.         root = merge(merge(less, equal), greater);
  199.     }
  200. };
  201.  
  202. signed main() {
  203. #ifdef _DEBUG
  204.     freopen("in.txt", "r", stdin);
  205.     freopen("out.txt", "w", stdout);
  206. #endif
  207.     ios_base::sync_with_stdio(0);
  208.     cin.tie(NULL);
  209.     cout.tie(NULL);
  210.     ll t = 1;
  211.     //cin >> t;
  212.     while (t--) {
  213.         ll n, m, i, j, l, r;
  214.         cin >> n >> m;
  215.         dd2 tree;
  216.         for (i = 0; i < n; i++) {
  217.             cin >> j;
  218.             tree.push_back(j);
  219.         }
  220.         while (m--) {
  221.             cin >> j >> l >> r;
  222.             if (j == 1) {
  223.                 tree.reverse(l - 1, r - 1);
  224.             }
  225.             else {
  226.                 cout << tree.minValue(l - 1, r - 1) << endl;
  227.             }
  228.         }
  229.     }
  230. }
  231. //痛みを受け入れる。 痛みを知っています。 痛みを感じる。 痛みを参照してください。 真の痛みを知らなければ、真の世界を理解することは不可能です。 今、あなたは痛みを知るでしょう。 神の罰!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement