Submission #1015269

#TimeUsernameProblemLanguageResultExecution timeMemory
1015269aufanExamination (JOI19_examination)C++17
100 / 100
1242 ms151912 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define int long long #define fi first #define se second #define ordered_multiset tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> using namespace std; using namespace __gnu_pbds; struct node { ordered_multiset ms; int st, en; node *left, *right; void build(int start, int end) { st = start; en = end; if (st == en) { return; } int md = (st + en) / 2; left = new node(); right = new node(); left->build(st, md); right->build(md + 1, en); } int query(int lf, int rg, int x) { if (st > rg || en < lf) return 0ll; if (lf <= st && en <= rg) return (int)ms.size() - ms.order_of_key(x); return left->query(lf, rg, x) + right->query(lf, rg, x); } void update(int id, int x) { if (st > id || en < id) return; ms.insert(x); if (st == en) return; left->update(id, x); right->update(id, x); } } sg; int32_t main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; cin >> n >> q; vector<int> s(n), t(n); for (int i = 0; i < n; i++) cin >> s[i] >> t[i]; vector<int> ord(n); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&](int x, int y) { return s[x] + t[x] > s[y] + t[y]; }); vector<array<int, 4>> qr; for (int i = 0; i < q; i++) { int x, y, z; cin >> x >> y >> z; qr.push_back({x, y, z, i}); } sort(qr.begin(), qr.end(), [&](auto x, auto y) { return x[2] > y[2]; }); vector<int> b; for (int i = 0; i < n; i++) b.push_back(s[i]); sort(b.begin(), b.end()); b.erase(unique(b.begin(), b.end()), b.end()); int m = (int)b.size(); sg.build(1, m); auto get = [&](int x) { return lower_bound(b.begin(), b.end(), x) - b.begin(); }; int p = 0; vector<int> ans(q); for (auto [x, y, z, i] : qr) { while (p < n && s[ord[p]] + t[ord[p]] >= z) { sg.update(get(s[ord[p]]) + 1, t[ord[p]]); p += 1; } ans[i] = sg.query(get(x) + 1, m, y); } for (int i = 0; i < q; i++) cout << ans[i] << '\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...