dan_sml

Untitled

Jul 12th, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5.  
  6. int n, k;
  7. vector <vector <int>> a;
  8. vector <vector <int>> sorted;
  9. vector <int> h1, h2;
  10.  
  11. void result() {
  12.     for (int i = 0; i < a.size(); i++) {
  13.         for (int j = 0; j < a[i].size(); j++) cout << a[i][j] << " ";
  14.         cout << "\n";
  15.     }
  16.     cout << "sorted\n";
  17.     for (int i = 0; i < a.size(); i++) {
  18.         for (int j = 0; j < a[i].size(); j++) cout << sorted[i][j] << " ";
  19.         cout << "\n";
  20.     }
  21. }
  22.  
  23. void split(int i) {
  24.     copy(a[i].begin(), a[i].begin() + k, h1.begin());
  25.     copy(a[i].begin() + k, a[i].end(), h2.begin());
  26.     sorted.erase(sorted.begin() + i);
  27.     a.erase(a.begin() + i);
  28.     a.insert(a.begin() + i, h2);
  29.     a.insert(a.begin() + i, h1);
  30.     sorted.insert(sorted.begin() + i, h2);
  31.     sort(sorted[i].begin(), sorted[i].end());
  32.     sorted.insert(sorted.begin() + i, h1);
  33.     sort(sorted[i].begin(), sorted[i].end());
  34.     return;
  35. }
  36.  
  37. void ins(int pos, int val) {
  38.     int i = 0;
  39.     while (pos >= a[i].size() && i < a.size()) pos -= a[i].size(), i++;
  40.     if (i == a.size()) i--, a[i].emplace_back(val);
  41.     else a[i].insert(a[i].begin() + pos, val);
  42.     sorted[i].emplace_back(val);
  43.     pos = sorted[i].size() - 1;
  44.     int j = pos - 1;
  45.     while (sorted[i][j] > sorted[i][pos] && pos > 0) {
  46.         swap(sorted[i][j], sorted[i][pos]);
  47.         pos--;
  48.         j--;
  49.     }
  50.     if(a[i].size() == 2 * k) split(i);
  51.     return;
  52. }
  53.  
  54. void del(int pos) {
  55.     int i = 0;
  56.     while (pos >= a[i].size()) pos -= a[i].size(), i++;
  57.     int val = a[i][pos];
  58.     a[i].erase(a[i].begin() + pos);
  59.     sorted[i].erase(lower_bound(sorted[i].begin(), sorted[i].end(), val));
  60.     if (a[i].size() == 0) {
  61.         a.erase(a.begin() + i);
  62.         sorted.erase(sorted.begin() + i);
  63.     }
  64.     return;
  65. }
  66.  
  67. int ans(int l, int r, int x) {
  68.     int ans = 0, l0 = 0, r0 = l0;
  69.     for (int i = 0; i < a.size(); i++) {
  70.         r0 = l0 + a[i].size() - 1;
  71.         if (l <= l0 && r0 <= r) {
  72.             ans += (upper_bound(sorted[i].begin(), sorted[i].end(), x) - sorted[i].begin());
  73.         }
  74.         else if (r0 < l || r < l0) {}
  75.         else if (l <= l0) {
  76.             for (int j = 0; l0 + j <= r; j++) {
  77.                 if (a[i][j] <= x) ans++;
  78.             }
  79.         }
  80.         else if (r0 <= r) {
  81.             for (int j = l - l0; j < a[i].size(); j++) {
  82.                 if (a[i][j] <= x) ans++;
  83.             }
  84.         }
  85.         l0 += a[i].size();
  86.     }
  87.     return ans;
  88. }
  89.  
  90. signed main() {
  91.     ios::sync_with_stdio(0);
  92.     cin.tie(0);
  93.     int ai;
  94.     cin >> n;
  95.     k = sqrt(n);
  96.     h1.resize(k);
  97.     h2.resize(k);
  98.     a.resize((n - 1) / k + 1);
  99.     sorted.resize((n - 1) / k + 1);
  100.     for (int i = 0; i < n; i++) {
  101.         cin >> ai;
  102.         a[i / k].emplace_back(ai);
  103.         sorted[i / k].emplace_back(ai);
  104.     }
  105.     for (int i = 0; i < sorted.size(); i++) sort(sorted[i].begin(), sorted[i].end());
  106.     string type;
  107.     while (cin >> type) {
  108.         if (type == "+") {
  109.             int pos, val;
  110.             cin >> pos >> val;
  111.             ins(pos, val);
  112.             //result();
  113.         }
  114.         else if (type == "-") {
  115.             int pos;
  116.             cin >> pos;
  117.             del(pos);
  118.             //result();
  119.         }
  120.         else {
  121.             int l, r, x;
  122.             cin >> l >> r >> x;
  123.             cout << ans(l, r, x) << "\n";
  124.             //result();
  125.         }
  126.     }
  127. }
Add Comment
Please, Sign In to add comment