#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXA = 1000005;
const int MAXST = MAXA * 4;
const long long bruh = (long long)1e16;
int a, c;
struct node { int h, l, r; } z[MAXA];
vector<int> sta[MAXA], fin[MAXA];
struct query { int l, r, id; } q[MAXA];
int res[MAXA];
bool cmp(query A, query B) {
return A.r < B.r;
}
long long f[MAXST], f1[MAXST], lazy[MAXST];
void push(int id) {
if (lazy[id] != -bruh) {
f1[id] = max(f1[id], lazy[id] - f[id]);
int lc = id * 2;
int rc = id * 2 + 1;
lazy[lc] = max(lazy[lc], lazy[id]);
lazy[rc] = max(lazy[rc], lazy[id]);
lazy[id] = -bruh;
}
}
void build(int id, int l, int r) {
lazy[id] = -bruh;
f[id] = bruh + 10;
f1[id] = -bruh;
if (l == r) return;
int mid = (l + r) / 2;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
}
void update(int id, int l, int r, int pos, int val) {
push(id);
if (l == r) {
f[id] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid) {
push(id * 2 + 1);
update(id * 2, l, mid, pos, val);
} else {
push(id * 2);
update(id * 2 + 1, mid + 1, r, pos, val);
}
f[id] = min(f[id * 2], f[id * 2 + 1]);
f1[id] = max(f1[id * 2], f1[id * 2 + 1]);
}
void update1(int id, int l, int r, int x, int y, int val) {
push(id);
if (y < l || r < x) return;
if (x <= l && r <= y) {
lazy[id] = max(lazy[id], val);
push(id);
return;
}
int mid = (l + r) / 2;
update1(id * 2, l, mid, x, y, val);
update1(id * 2 + 1, mid + 1, r, x, y, val);
f[id] = min(f[id * 2], f[id * 2 + 1]);
f1[id] = max(f1[id * 2], f1[id * 2 + 1]);
}
int get(int id, int l, int r, int x, int y) {
push(id);
if (y < l || r < x) return -bruh;
if (x <= l && r <= y) return f1[id];
int mid = (l + r) / 2;
return max(
get(id * 2, l, mid, x, y),
get(id * 2 + 1, mid + 1, r, x, y)
);
}
void check() {
build(1, 1, a);
int cnt = 0;
for (int i = 1; i <= c; i++) {
int L = q[i].l, R = q[i].r, idx = q[i].id;
while (cnt < R) {
cnt++;
for (int p : sta[cnt]) {
update(1, 1, a, p, z[p].h);
}
for (int p : fin[cnt]) {
update(1, 1, a, p, bruh + 10);
}
int lo = max(1LL, cnt - z[cnt].r);
int hi = max(1LL, cnt - z[cnt].l);
if (lo <= hi)
update1(1, 1, a, lo, hi, z[cnt].h);
}
res[idx] = max(res[idx], get(1, 1, a, L, R));
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> a;
for (int i = 1; i <= a; i++) {
cin >> z[i].h >> z[i].l >> z[i].r;
if (i + z[i].l <= a) sta[i + z[i].l].push_back(i);
if (i + z[i].r <= a) fin[i + z[i].r + 1].push_back(i);
}
cin >> c;
for (int i = 1; i <= c; i++) {
cin >> q[i].l >> q[i].r;
q[i].id = i;
}
sort(q + 1, q + 1 + c, cmp);
for (int i = 1; i <= c; i++) res[i] = -1;
check();
for (int i = 1; i <= a; i++) {
z[i].h = bruh - z[i].h+1;
sta[i].clear();
fin[i].clear();
}
for (int i = a + 1; i < MAXA; ++i) {
sta[i].clear();
fin[i].clear();
}
for (int i = 1; i <= a; i++) {
if (i + z[i].l <= a) sta[i + z[i].l].push_back(i);
if (i + z[i].r + 1 <= a) fin[i + z[i].r + 1].push_back(i);
}
check();
for (int i = 1; i <= c; i++) {
cout << res[i] << "\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |