Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- int n, k;
- vector <vector <int>> a;
- vector <vector <int>> sorted;
- vector <int> h1, h2;
- void result() {
- for (int i = 0; i < a.size(); i++) {
- for (int j = 0; j < a[i].size(); j++) cout << a[i][j] << " ";
- cout << "\n";
- }
- cout << "sorted\n";
- for (int i = 0; i < a.size(); i++) {
- for (int j = 0; j < a[i].size(); j++) cout << sorted[i][j] << " ";
- cout << "\n";
- }
- }
- void split(int i) {
- copy(a[i].begin(), a[i].begin() + k, h1.begin());
- copy(a[i].begin() + k, a[i].end(), h2.begin());
- sorted.erase(sorted.begin() + i);
- a.erase(a.begin() + i);
- a.insert(a.begin() + i, h2);
- a.insert(a.begin() + i, h1);
- sorted.insert(sorted.begin() + i, h2);
- sort(sorted[i].begin(), sorted[i].end());
- sorted.insert(sorted.begin() + i, h1);
- sort(sorted[i].begin(), sorted[i].end());
- return;
- }
- void ins(int pos, int val) {
- int i = 0;
- while (pos >= a[i].size() && i < a.size()) pos -= a[i].size(), i++;
- if (i == a.size()) i--, a[i].emplace_back(val);
- else a[i].insert(a[i].begin() + pos, val);
- sorted[i].emplace_back(val);
- pos = sorted[i].size() - 1;
- int j = pos - 1;
- while (sorted[i][j] > sorted[i][pos] && pos > 0) {
- swap(sorted[i][j], sorted[i][pos]);
- pos--;
- j--;
- }
- if(a[i].size() == 2 * k) split(i);
- return;
- }
- void del(int pos) {
- int i = 0;
- while (pos >= a[i].size()) pos -= a[i].size(), i++;
- int val = a[i][pos];
- a[i].erase(a[i].begin() + pos);
- sorted[i].erase(lower_bound(sorted[i].begin(), sorted[i].end(), val));
- if (a[i].size() == 0) {
- a.erase(a.begin() + i);
- sorted.erase(sorted.begin() + i);
- }
- return;
- }
- int ans(int l, int r, int x) {
- int ans = 0, l0 = 0, r0 = l0;
- for (int i = 0; i < a.size(); i++) {
- r0 = l0 + a[i].size() - 1;
- if (l <= l0 && r0 <= r) {
- ans += (upper_bound(sorted[i].begin(), sorted[i].end(), x) - sorted[i].begin());
- }
- else if (r0 < l || r < l0) {}
- else if (l <= l0) {
- for (int j = 0; l0 + j <= r; j++) {
- if (a[i][j] <= x) ans++;
- }
- }
- else if (r0 <= r) {
- for (int j = l - l0; j < a[i].size(); j++) {
- if (a[i][j] <= x) ans++;
- }
- }
- l0 += a[i].size();
- }
- return ans;
- }
- signed main() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- int ai;
- cin >> n;
- k = sqrt(n);
- h1.resize(k);
- h2.resize(k);
- a.resize((n - 1) / k + 1);
- sorted.resize((n - 1) / k + 1);
- for (int i = 0; i < n; i++) {
- cin >> ai;
- a[i / k].emplace_back(ai);
- sorted[i / k].emplace_back(ai);
- }
- for (int i = 0; i < sorted.size(); i++) sort(sorted[i].begin(), sorted[i].end());
- string type;
- while (cin >> type) {
- if (type == "+") {
- int pos, val;
- cin >> pos >> val;
- ins(pos, val);
- //result();
- }
- else if (type == "-") {
- int pos;
- cin >> pos;
- del(pos);
- //result();
- }
- else {
- int l, r, x;
- cin >> l >> r >> x;
- cout << ans(l, r, x) << "\n";
- //result();
- }
- }
- }
Add Comment
Please, Sign In to add comment