제출 #1321448

#제출 시각아이디문제언어결과실행 시간메모리
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...