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
| #include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn = 3e5 + 10; const int MX = 1e6 + 10; int n, q, cnt, ans[maxn], root[maxn]; int ls[maxn << 5], rs[maxn << 5], sz[maxn << 5]; ll sm[maxn << 5], T; pair <int, int> a[maxn];
void insert(int &x, int l, int r, int p) { int pre = x; x = ++cnt; sz[x] = sz[pre] + 1; sm[x] = sm[pre] + p; ls[x] = ls[pre], rs[x] = rs[pre]; if (l == r) return; int mid = (l + r) >> 1; if (p <= mid) insert(ls[x], l, mid, p); else insert(rs[x], mid + 1, r, p); }
ll query(int tl, int tr, int l, int r, int k) { if (l == r) return 1ll * l * k; int mid = (l + r) >> 1, lsz = sz[ls[tr]] - sz[ls[tl]]; if (k <= lsz) return query(ls[tl], ls[tr], l, mid, k); return sm[ls[tr]] - sm[ls[tl]] + query(rs[tl], rs[tr], mid + 1, r, k - lsz); }
inline ll read() { ll x(0); char o(getchar()); while (o < '0' || o > '9') o = getchar(); for (; o >= '0' && o <= '9'; o = getchar()) x = (x << 1) + (x << 3) + (o ^ 48); return x; }
int main() { freopen ("treasure.in", "r", stdin); freopen ("treasure.out", "w", stdout);
n = read(), T = read(), q = read(); for (int i = 1; i <= n; ++i) a[i].first = read(), a[i].second = read(); sort (a + 1, a + n + 1); for (int i = 1; i <= n; ++i) insert(root[i] = root[i - 1], 0, MX, a[i].second);
int p = n; for (int i = 0; i <= (n - 1) / 2; ++i) { ans[i] = -1; for (p = min(p, n - i); p > i; --p) { ll t = query(root[0], root[p - 1], 0, MX, i) + query(root[p], root[n], 0, MX, i) + a[p].second; if (t <= T) { ans[i] = a[p].first; break; } } }
while (q--) printf ("%d\n", ans[read() / 2]); }
|