Submission #1321448

#TimeUsernameProblemLanguageResultExecution timeMemory
1321448vnhbestBubble Sort Machine (JOI25_bubble)C++20
100 / 100
1743 ms141148 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...