rt,调炸了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
int n, m;
struct Node {
int d, p;
ll l;
bool operator <(const Node &t) const {
return d > t.d;
}
void read() {
cin >> d >> p >> l;
}
} a[N];
struct Segment_Tree {
struct Data {
int l, r;
ll lim, sum; // sum 钱数 lim 上限
#define l(x) tr[x].l
#define r(x) tr[x].r
#define sum(x) tr[x].sum
#define lim(x) tr[x].lim
} tr[N << 2];
void pushup(int x) {
sum(x) = sum(x * 2) + sum(x * 2 + 1);
lim(x) = lim(x * 2) + lim(x * 2 + 1);
}
void build(int l, int r, int x) {
tr[x] = {l, r, 0ll, 0ll};
if (l == r) return;
int mid = (l + r) / 2;
build(l, mid, x * 2), build(mid + 1, r, x * 2 + 1);
pushup(x);
}
void update(int x, int p, ll v) {
if (l(x) == r(x)) {
lim(x) += v;
sum(x) += 1ll * v * l(x);
return;
}
int mid = (l(x) + r(x)) / 2;
if (p <= mid) update(x * 2, p, v);
else update(x * 2 + 1, p, v);
pushup(x);
}
ll query(int x, ll k) { // 要k升果汁至少多少钱
if (!k) return 0ll;
if (l(x) == r(x)) {
return 1ll * k * l(x);
}
if (k <= lim(x * 2)) return query(x * 2, k);
else return sum(x * 2) + query(x * 2 + 1, k - lim(x * 2));
}
} SegT;
struct Q {
ll g, l;
int id;
};
int ans[N];
void solve(int l, int r, vector<Q> &qry) {
if (l > r) return;
if (l == r) {
for (auto q : qry) ans[q.id] = a[l].d;
return;
}
int mid = (l + r) / 2;
vector<Q> q1, q2;
for (int i = l; i <= mid; i ++) {
SegT.update(1, a[i].p, a[i].l);
}
for (auto q : qry) {
if (SegT.query(1, q.l) <= q.g) q1.push_back(q);
else q2.push_back(q);
}
solve(mid + 1, r, q2);
for (int i = l; i <= mid; i ++) {
SegT.update(1, a[i].p, -a[i].l);
}
solve(l, mid, q1);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
a[i].read();
}
SegT.build(0, N - 5, 1);
a[++ n] = {-1, 0, (ll)1e18};
sort(a + 1, a + 1 + n);
vector<Q> qry;
for (int i = 1; i <= m; i ++) {
ll g, l;
cin >> g >> l;
qry.push_back({g, l, i});
}
solve(1, n, qry);
for (int i = 1; i <= m; i ++) {
cout << ans[i] << '\n';
}
return 0;
}