Advertisement
dan_sml

Untitled

Jul 21st, 2020
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5.  
  6. const int INF = 1e9 + 1;
  7. int n, m, k;
  8. vector <vector <int>> a;
  9. vector <int> sm;
  10. vector <bool> is_reversed;
  11. vector <int> h, a1, a2;
  12.  
  13. void result() {
  14.     for (int i = 0; i < a.size(); i++) {
  15.         for (int j = 0; j < a[i].size(); j++) cout << a[i][j] << " ";
  16.         cout << " MIN: " << sm[i] << " REV: " << is_reversed[i];
  17.         cout << "\n";
  18.     }
  19.     cout << "\n\n";
  20. }
  21.  
  22. void split(int i) {
  23.     h.resize(a[i].size() - k);
  24.     copy(a[i].begin() + k, a[i].end(), h.begin());
  25.     a.insert(a.begin() + i + 1, h);
  26.     sm.insert(sm.begin() + i + 1, INF);
  27.     is_reversed.insert(is_reversed.begin() + i + 1, false);
  28.     a[i].resize(k);
  29.     sm[i] = INF;
  30.     for (int j = 0; j < a[i].size(); j++) sm[i] = min(sm[i], a[i][j]);
  31.     for (int j = 0; j < a[i + 1].size(); j++) sm[i + 1] = min(sm[i + 1], a[i + 1][j]);
  32. }
  33.  
  34. void swap_(int l1, int r1, int i1, int l2, int r2, int i2) {
  35.     a1.resize(l1 + r2 + 1);
  36.     a2.resize(a[i1].size() - l1 + a[i2].size() - r2 - 1);
  37.     copy(a[i1].begin(), a[i1].begin() + l1, a1.begin());
  38.     copy(a[i2].begin(), a[i2].begin() + r2 + 1, a1.begin() + l1);
  39.     copy(a[i1].begin() + l1, a[i1].end(), a2.begin());
  40.     copy(a[i2].begin() + r2 + 1, a[i2].end(), a2.begin() + a[i1].size() - l1);
  41.     swap(a[i1], a1);
  42.     swap(a[i2], a2);
  43.     sm[i1] = INF;
  44.     for (int i = 0; i < a[i1].size(); i++) sm[i1] = min(sm[i1], a[i1][i]);
  45.     sm[i2] = INF;
  46.     for (int i = 0; i < a[i2].size(); i++) sm[i2] = min(sm[i2], a[i2][i]);
  47. }
  48.  
  49. int sum(int l, int r, int i) {
  50.     int res = INF;
  51.     for (int j = l; j <= r; j++) res = min(res, a[i][j]);
  52.     return res;
  53. }
  54.  
  55. void apply(int i) {
  56.     if (is_reversed[i]) reverse(a[i].begin(), a[i].end());
  57.     is_reversed[i] = false;
  58. }
  59.  
  60. void reverse_(int l, int r) {
  61.     int l0 = 0, r0, ft = INF, lt = 0, pos_ft, pos_lt;
  62.     for (int i = 0; i < a.size(); i++) {
  63.         r0 = l0 + a[i].size() - 1;
  64.         if (!(r < l0 || r0 < l)) {
  65.             if (i < ft) {
  66.                 ft = i;
  67.                 pos_ft = l0;
  68.             }
  69.             lt = i;
  70.             pos_lt = l0;
  71.             is_reversed[i] = !is_reversed[i];
  72.         }
  73.         l0 = r0 + 1;
  74.     }
  75.     if (ft - lt == 0) {
  76.         is_reversed[ft] = !is_reversed[ft];
  77.         apply(ft);
  78.         reverse(a[ft].begin() + l - pos_ft, a[ft].begin() + r - pos_ft + 1);
  79.     }
  80.     else {
  81.         is_reversed[ft] = !is_reversed[ft];
  82.         is_reversed[lt] = !is_reversed[lt];
  83.         apply(ft);
  84.         apply(lt);
  85.         int l1 = l - pos_ft, r1 = a[ft].size() - 1;
  86.         int l2 = 0, r2 = r - pos_lt;
  87.         reverse(a[ft].begin() + l1, a[ft].begin() + r1 + 1);
  88.         reverse(a[lt].begin() + l2, a[lt].begin() + r2 + 1);
  89.         swap_(l1, r1, ft, l2, r2, lt);
  90.         if (a[ft].size() >= 2 * k) split(ft), ft++, lt++;
  91.         if (a[lt].size() >= 2 * k) split(lt);
  92.     }
  93.     if (lt - ft > 2) {
  94.         reverse(a.begin() + ft + 1, a.begin() + lt);
  95.         reverse(sm.begin() + ft + 1, sm.begin() + lt);
  96.         reverse(is_reversed.begin() + ft + 1, is_reversed.begin() + lt);
  97.     }
  98. }
  99.  
  100. int ans(int l, int r) {
  101.     int l0 = 0, r0, res = INF;
  102.     for (int i = 0; i < a.size(); i++) {
  103.         r0 = l0 + a[i].size() - 1;
  104.         if (l <= l0 && r0 <= r) res = min(sm[i], res);
  105.         else if (!(r < l0 || r0 < l)) {
  106.             apply(i);
  107.             res = min(sum(max(l, l0) - l0, min(r, r0) - l0, i), res);
  108.         }
  109.         l0 = r0 + 1;
  110.     }
  111.     return res;
  112. }
  113.  
  114. signed main() {
  115.     ios::sync_with_stdio(0);
  116.     cin.tie(0);
  117.     cin >> n >> m;
  118.     k = sqrt(n);
  119.     a.resize((n - 1) / k + 1);
  120.     sm.assign((n - 1) / k + 1, INF);
  121.     is_reversed.assign((n - 1) / k + 1, false);
  122.     for (int i = 0; i < n; i++) {
  123.         int ai;
  124.         cin >> ai;
  125.         a[i / k].push_back(ai);
  126.         sm[i / k] = min(sm[i / k], ai);
  127.     }
  128.     for (int _ = 0; _ < m; _++) {
  129.         int type, l, r;
  130.         cin >> type >> l >> r;
  131.         l--;
  132.         r--;
  133.         if (type == 1) reverse_(l, r);
  134.         else cout << ans(l, r) << "\n";
  135.     }
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement