1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <bits/stdc++.h>
using namespace std; using ll = long long; using pii = pair<int, int>;
const int MAXN = 2e5 + 10;
struct Query { int k, p, id; bool operator<(const Query &oth) const { return k < oth.k; } };
struct Node { int val, cnt; };
struct SegTree { Node dat[MAXN << 2], E = {0}; Node comb(const Node &dat1, const Node &dat2) { return {dat1.val + dat2.val, dat1.cnt + dat2.cnt}; } void modify(int root, int l, int r, int pos, int val) { if (l == r) { dat[root] = {val, 1}; return; } int mid = l + r >> 1; if (pos <= mid) { modify(root << 1, l, mid, pos, val); } else { modify(root << 1 | 1, mid + 1, r, pos, val); } dat[root] = comb(dat[root << 1], dat[root << 1 | 1]); } int query(int root, int l, int r, int k) { if (l == r) { return dat[root].val; } int mid = l + r >> 1; if (dat[root << 1].cnt >= k) { return query(root << 1, l, mid, k); } else { return query(root << 1 | 1, mid + 1, r, k - dat[root << 1].cnt); } } } T;
int n, m, ans[MAXN]; pii a[MAXN]; vector<Query> Q;
int main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].first; a[i].second = i; } sort(a + 1, a + n + 1, [](const pii &i, const pii &j) { return i.first > j.first || (i.first == j.first && i.second < j.second); }); cin >> m; for (int i = 1; i <= m; i++) { int k, p; cin >> k >> p; Q.push_back({k, p, i}); } sort(Q.begin(), Q.end()); int last = 1; for (Query &q : Q) { for (; last <= q.k; last++) { T.modify(1, 1, n, a[last].second, a[last].first); } ans[q.id] = T.query(1, 1, n, q.p); } for (int i = 1; i <= m; i++) { cout << ans[i] << '\n'; } return 0; }
|