rembocoder

Untitled

May 7th, 2023
975
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.68 KB | None | 0 0
  1. #pragma GCC target ("avx2")
  2. #pragma GCC optimization ("O3")
  3. #pragma GCC optimization ("unroint-loops")
  4. #pragma GCC optimize("Ofast,no-stack-protector")
  5. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2")
  6. #pragma GCC optimize("unroll-loops")
  7. #include <bits/stdc++.h>
  8. #define int           int64_t
  9. #define ull           unsigned long long
  10. #define ld            long double
  11. #define INF           (int)2e16
  12.  
  13. #define rng(i,a,b)    for(int i=int(a);i<int(b);i++)
  14. #define gnr(i,a,b)    for(int i=int(b)-1;i>=int(a);i--)
  15. #define per(i,b)      gnr(i,0,b)
  16. #define rep(i,b)      rng(i,0,b)
  17.  
  18. #define endl          '\n'
  19. #define yes           "YES\n"
  20. #define no            "NO\n"
  21.  
  22. #define F             first
  23. #define S             second
  24.  
  25. #define all(a)        a.begin(),a.end()
  26. #define rall(a)       a.rbegin(),a.rend()
  27. #define __sort(x)     sort(x.begin(), x.end())
  28. #define __rsort(x)    sort(x.rbegin(), x.rend())
  29. #define __lcm(a, b)   (int(a) * int(b) / (__gcd(int(a), int(b))))
  30.  
  31. #define out_1arr(a, ch123)   for(auto el_ : a) cout << el_ << ch123;
  32. #define out_2arr(a, ch123)   for(auto row_ : a) {for(auto col_ : row_) cout << col_ << ch123; cout << endl;}
  33.  
  34. #define optimize()    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
  35. #define multitest()   int ttt;cin >> ttt;rep(t_cnt, ttt)
  36. using namespace std;
  37. #ifdef LOCAL
  38. mt19937 tw(9450189);
  39. #else
  40. mt19937 tw(chrono::high_resolution_clock::now().time_since_epoch().count());
  41. #endif
  42. uniform_int_distribution<int> ll_distr;
  43. int rnd(int a, int b) { return ll_distr(tw) % (b - a + 1) + a; }
  44.  
  45. struct Node {
  46.     int l, r, x, priority, size;
  47.     int min;
  48.     bool inv;
  49.  
  50.     Node(int _x = -1, int l = -1, int r = -1,
  51.          int pr = rnd(1, 1000000000)): x(_x), priority(pr), l(l),
  52.          r(r), size(1), min(_x), inv(false) {}
  53. };
  54.  
  55. const int NMAX = 1e5 + 10;
  56. vector<Node> t(NMAX);
  57. int cur_new = 0, root = -1;
  58.  
  59. int get_size(int v) {
  60.     if (v == -1)
  61.         return 0;
  62.     return t[v].size;
  63. }
  64.  
  65. int get_min(int v) {
  66.     if (v == -1)
  67.         return INF;
  68.     return t[v].min;
  69. }
  70.  
  71. void update(int v) {
  72.     if (v == -1) return;
  73.     t[v].size = get_size(t[v].l) + get_size(t[v].r) + 1;
  74.     t[v].min = min(min(get_min(t[v].l), get_min(t[v].r)), t[v].x);
  75. }
  76.  
  77. void give(int v) {
  78.     if (v != -1 && t[v].inv) {
  79.         t[v].inv = false;
  80.         swap(t[v].l, t[v].r);
  81.         if (t[v].l != -1) {
  82.             t[t[v].l].inv ^= 1;
  83.         }
  84.         if (t[v].r != -1) {
  85.             t[t[v].r].inv ^= 1;
  86.         }
  87.     }
  88. }
  89.  
  90. int merge(int l, int r) {
  91.     give(l);
  92.     give(r);
  93.     if (l == -1) return r;
  94.     if (r == -1) return l;
  95.     if (t[l].priority < t[r].priority) {
  96.         t[l].r = merge(t[l].r, r);
  97.         update(l);
  98.         return l;
  99.     } else {
  100.         t[r].l = merge(l, t[r].l);
  101.         update(r);
  102.         return r;
  103.     }
  104. }
  105.  
  106. void split(int v, int k, int &l, int &r) {
  107.     give(v);
  108.     if (v == -1)
  109.         l = r = -1;
  110.     else if (get_size(t[v].l) < k) {
  111.         split(t[v].r, k - get_size(t[v].l) - 1, t[v].r, r);
  112.         l = v;
  113.     } else {
  114.         split(t[v].l, k, l, t[v].l);
  115.         r = v;
  116.     }
  117.     update(v);
  118. }
  119.  
  120. int32_t main() {
  121.     optimize();
  122.     int n, m;
  123.     cin >> n >> m;
  124.     for (int i = 0; i < n; i++) {
  125.         int x;
  126.         cin >> x;
  127.         t[cur_new++] = {x};
  128.         root = merge(root, cur_new - 1);
  129.     }
  130.     while (m--) {
  131.         int type, l, r;
  132.         cin >> type >> l >> r;
  133.         l--;
  134.         int a, b, c;
  135.         split(root, r, root, c);
  136.         split(root, l, a, b);
  137.         if (type == 2) {
  138.             cout << get_min(b) << '\n';
  139.         } else {
  140.             t[b].inv ^= 1;
  141.         }
  142.         root = merge(a, b);
  143.         root = merge(root, c);
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment