Advertisement
cosenza987

Untitled

Feb 10th, 2024
1,032
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. //Слава Україні, Героям слава
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 1e6 + 7, LOG = 18, M = 1e9 + 7;
  8. const int NN = N * LOG;
  9.  
  10. namespace pseg {
  11.     long long seg[NN];
  12.     int roots[N], L[NN], R[NN], cnt = 1;
  13.     void insert(int x, int val, int pcur = -1, int p = -1, int l = 1, int r = M) {
  14.         if(pcur == -1) {
  15.             pcur = roots[x] = cnt++;
  16.         }
  17.         if(p == -1) {
  18.             p = roots[x - 1];
  19.         }
  20.         seg[pcur] = seg[p] + 1;
  21.         if(l == r) {
  22.             return;
  23.         }
  24.         int mid = (l + r) >> 1;
  25.         if(val > mid) {
  26.             L[pcur] = L[p];
  27.             R[pcur] = cnt++;
  28.             insert(x, val, R[pcur], R[p], mid + 1, r);
  29.         } else {
  30.             R[pcur] = R[p];
  31.             L[pcur] = cnt++;
  32.             insert(x, val, L[pcur], L[p], l, mid);
  33.         }
  34.     }
  35.     long long find(int p1, int p2, int i, int j, int l = 1, int r = M) {
  36.         if(i > r or j < l) {
  37.             return 0;
  38.         }
  39.         if(i <= l and r <= j) {
  40.             return seg[p1] - seg[p2];
  41.         }
  42.         int mid = (l + r) >> 1;
  43.         return find(L[p1], L[p2], i, j, l, mid) + find(R[p1], R[p2], i, j, mid + 1, r);
  44.     }
  45. };
  46.  
  47. int main() {
  48.     ios_base::sync_with_stdio(false);
  49.     cin.tie(nullptr);
  50.     int n, q;
  51.     cin >> n >> q;
  52.     vector<int> v(n + 1);
  53.     for(int i = 1; i <= n; i++) {
  54.         cin >> v[i];
  55.         pseg::insert(i, v[i]);
  56.     }
  57.     while(q--) {
  58.         char c;
  59.         cin >> c;
  60.         if(c == 'Q') {
  61.             int a, b, x;
  62.             cin >> a >> b >> x;
  63.             int l = 0, r = 1e9, ans = 0;
  64.             while(l <= r) {
  65.                 int mid = (l + r) >> 1;
  66.                 if(pseg::find(pseg::roots[b], pseg::roots[a - 1], 0, mid) >= x) {
  67.                     ans = mid;
  68.                     r = mid - 1;
  69.                 } else {
  70.                     l = mid + 1;
  71.                 }
  72.             }
  73.             cout << ans << "\n";
  74.         } else {
  75.             int x;
  76.             cin >> x;
  77.             swap(v[x], v[x + 1]);
  78.             pseg::insert(x, v[x], pseg::roots[x], pseg::roots[x - 1]);
  79.             pseg::insert(x + 1, v[x + 1], pseg::roots[x + 1], pseg::roots[x]);
  80.         }
  81.     }
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement