#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
#define ll long long
#define f first
#define s second
using namespace __gnu_pbds;
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
ordered_set<pair <ll, ll>> s;
struct quad {
ll f, s, t, four;
};
bool csort (quad a, quad b) {
return a.f < b.f;
}
ll n, q;
vector <pair <ll, ll>> vec;
vector <quad> que;
struct node {
node *left, *right;
ll S, E, val;
node (ll S, ll E);
void update (ll i, ll v);
ll queries (ll l, ll r);
}*st;
node::node (ll S, ll E) {
this -> S = S;
this -> E = E;
left = right = nullptr;
val = 0;
}
void node::update (ll i, ll v) {
if (i < S || E < i) {
return;
}
if (S == E) {
val += v;
return;
}
ll mid = (S + E) / 2;
if (left == nullptr) {
left = new node (S, mid);
right = new node (mid + 1, E);
}
left -> update(i, v);
right -> update(i, v);
val = left -> val + right -> val;
}
ll node::queries (ll l, ll r) {
if (r < S || E < l) {
return 0;
}
else if (l <= S && E <= r) {
return val;
}
ll mid = (S + E) / 2;
if (left == nullptr) {
left = new node (S, mid);
right = new node (mid + 1, E);
}
return left -> queries(l, r) + right -> queries(l, r);
}
int main () {
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> n;
vector <pair <ll, ll>> temp;
for (ll i = 0; i < n; i++) {
ll a;
cin >> a;
temp.push_back({a, i});
}
sort(temp.begin(), temp.end());
vec.resize(n);
for (ll i = 0; i < n; i++) {
vec[temp[i].s] = {temp[i].f, i};
}
ll k = 0;
cin >> q;
ll ct = 0;
for (ll i = 0; i < q; i++) {
ll a;
cin >> a;
if (a == 1) {
k++;
}
else {
ll b, c;
cin >> b >> c;
b -= 2;c--;
que.push_back({b + k, b, ct, 0});
que.push_back({c + k, c, ct, 1});
ct++;
}
}
sort(que.begin(), que.end(), csort);
st = new node (0, n - 1);
ll ind = 0;
ll sz = que.size() / 2;
vector <pair <ll, ll>> res(sz);
for (ll i = 0; i < que.size(); i++) {
ll a = que[i].f, b = que[i].s, c = que[i].t, d = que[i].four;
if (b < 0) {
res[c].f = 0;
continue;
}
//cout << a << " " << b << endl << endl;
while (ind <= a && ind < n) {
//cout << vec[ind].f << " " << vec[ind].s << endl;
s.insert({vec[ind].f, vec[ind].s});
st -> update(vec[ind].s, vec[ind].f);
ind++;
}
//cout << "ok" << endl;
pair <ll, ll> temp = *s.find_by_order(b);
//cout << b << " " << temp.f << " " << temp.s << endl;
ll lol = st -> queries(0, temp.s);
if (d == 0) {
res[c].f = lol;
}
else {
res[c].s = lol;
}
}
for (ll i = 0; i < sz; i++) {
cout << res[i].s - res[i].f << "\n";
}
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |