-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathE.cpp
71 lines (66 loc) · 1.92 KB
/
E.cpp
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
// LUOGU_RID: 160422599
#include <iostream>
#include <utility>
#include <cmath>
using namespace std;
typedef long long LL; typedef pair <LL, int> PLI;
const int N = 1e5 + 10;
struct Line {LL k, b;} l[N];
LL Calc(int id, int x) {return l[id].k * x + l[id].b;}
struct Node {int id, ls, rs;} t[N << 7]; int tot;
struct LCSeg {
#define mid (l + r >> 1)
#define lrt (t[rt].ls)
#define rrt (t[rt].rs)
#define MAXN 1'000'000
int Rt;
void down(int u, int l, int r, int &rt) {
if (!rt) rt = ++tot;
int &v = t[rt].id; LL bmid = Calc(u, mid) - Calc(v, mid);
if (bmid > 0) swap(u, v);
LL bl = Calc(u, l) - Calc(v, l), br = Calc(u, r) - Calc(v, r);
if (bl > 0) down(u, l, mid, lrt);
if (br > 0) down(u, mid + 1, r, rrt);
}
void upd(int id) {down(id, 0, MAXN, Rt);}
PLI qry(LL p, int l, int r, int rt) {
if (!rt) return {0, 0};
if (l == r) return {Calc(t[rt].id, p), t[rt].id};
PLI res = {Calc(t[rt].id, p), t[rt].id};
if (p <= mid) res = max(res, qry(p, l, mid, lrt));
else res = max(res, qry(p, mid + 1, r, rrt));
return res;
}
PLI qry(LL p) {return qry(p, 0, MAXN, Rt);}
#undef lrt
#undef rrt
#undef MAXN
} seg[N << 2];
#define lrt (rt << 1)
#define rrt (rt << 1 | 1)
void Upd(int p, int l, int r, int rt) {
seg[rt].upd(p);
if (l == r) return ;
if (p <= mid) Upd(p, l, mid, lrt);
else Upd(p, mid + 1, r, rrt);
}
PLI Qry(LL p, int ll, int rr, int l, int r, int rt) {
if (ll <= l && r <= rr) {return seg[rt].qry(p);}
if (rr <= mid) return Qry(p, ll, rr, l, mid, lrt);
if (mid < ll) return Qry(p, ll, rr, mid + 1, r, rrt);
return max(Qry(p, ll, rr, l, mid, lrt), Qry(p, ll, rr, mid + 1, r, rrt));
}
#undef mid
#undef lrt
#undef rrt
int n, q;
int main() {
cin >> n >> q;
for (int i = 1; i <= n; ++i)
cin >> l[i].b >> l[i].k, Upd(i, 1, n, 1);
for (int i = 1, l, r, t; i <= q; ++i) {
cin >> l >> r >> t;
cout << Qry(t, l, r, 1, n, 1).second << endl;
}
return 0;
}