#include <bits/stdc++.h>
using namespace std;
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; }
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#define sui cout.tie(NULL); cin.tie(NULL); ios_base::sync_with_stdio(false)
#define lid id << 1
#define rid id << 1 | 1
#define mid ((r + l) >> 1)
const ll MAX_N = 2e5 + 5;
const ll MOD = 1e9 + 7;
const ll INF = 1e12;
const ld EPS = 1e-9;
const ll LOG = 30;
pair<ll, pair<ll, ll>> seg[MAX_N << 2];
pair<ll, ll> ops[MAX_N << 2];
ll h[MAX_N];
void build(ll l, ll r, ll id)
{
seg[id] = {-INF, {-INF, INF}};
ops[id] = {-INF, INF};
if (l == r - 1) return;
build(l, mid, lid);
build(mid, r, rid);
}
void move(ll l, ll r, ll id)
{
if (l == r - 1) return;
seg[lid].first = max({seg[lid].first, ops[id].first - seg[lid].second.second, seg[lid].second.first - ops[id].second});
seg[rid].first = max({seg[rid].first, ops[id].first - seg[rid].second.second, seg[rid].second.first - ops[id].second});
ops[lid].first = max(ops[lid].first, ops[id].first);
ops[lid].second = min(ops[lid].second, ops[id].second);
ops[rid].first = max(ops[rid].first, ops[id].first);
ops[rid].second = min(ops[rid].second, ops[id].second);
ops[id] = {-INF, INF};
}
pair<ll, pair<ll, ll>> merge(pair<ll, pair<ll, ll>> x, pair<ll, pair<ll, ll>> y)
{
pair<ll, pair<ll, ll>> re;
re.first = max(x.first, y.first);
re.second.first = max(x.second.first, y.second.first);
re.second.second = min(x.second.second, y.second.second);
return re;
}
void upd(ll s, ll t, ll x, ll l, ll r, ll id)
{
move(l, r, id);
if (s <= l && t >= r)
{
ops[id].first = max(ops[id].first, x);
ops[id].second = min(ops[id].second, x);
seg[id].first = max({seg[id].first, x - seg[id].second.second, seg[id].second.first - x});
return;
}
if (s < mid) upd(s, t, x, l, mid, lid);
if (t > mid) upd(s, t, x, mid, r, rid);
seg[id] = merge(seg[lid], seg[rid]);
}
void rem(ll x, ll l, ll r, ll id)
{
move(l, r, id);
if (l == r - 1)
{
seg[id].second = {-INF, INF};
return;
}
if (x < mid) rem(x, l, mid, lid);
else rem(x, mid, r, rid);
seg[id] = merge(seg[lid], seg[rid]);
}
void add(ll x, ll l, ll r, ll id)
{
move(l, r, id);
if (l == r - 1)
{
seg[id].second = {h[l], h[l]};
return;
}
if (x < mid) add(x, l, mid, lid);
else add(x, mid, r, rid);
seg[id] = merge(seg[lid], seg[rid]);
}
ll get(ll s, ll t, ll l, ll r, ll id)
{
move(l, r, id);
if (s <= l && t >= r) return seg[id].first;
if (s >= r || t <= l) return -INF;
return max(get(s, t, l, mid, lid), get(s, t, mid, r, rid));
}
void solve() {
ll n;
cin >> n;
ll a[n];
ll b[n];
for (ll i = 0; i < n; i++) cin >> h[i] >> a[i] >> b[i];
ll q;
cin >> q;
ll ans[q];
vector<pair<ll, ll>> qs[n];
for (ll i = 0; i < q; i++)
{
ll l, r;
cin >> l >> r;
l--, r--;
qs[l].push_back({r, i});
}
vector<ll> add1[n];
vector<ll> rem1[n];
for (ll i = 0; i < n; i++)
{
if (i - a[i] >= 0) add1[i - a[i]].push_back(i);
if (i - b[i] - 1 >= 0) rem1[i - b[i] - 1].push_back(i);
}
build(0, n, 1);
for (ll i = n - 1; i >= 0; i--)
{
for (ll x : add1[i]) add(x, 0, n, 1);
for (ll x : rem1[i]) rem(x, 0, n, 1);
if (i + a[i] < n) upd(i + a[i], min(n, i + b[i] + 1), h[i], 0, n, 1);
for (auto x : qs[i]) ans[x.second] = get(i, x.first + 1, 0, n, 1);
}
for (ll i = 0; i < q; i++) cout << max(ans[i], (ll) -1) << "\n";
}
int main() {
sui;
ll tc = 1;
//cin >> tc;
for (ll t = 1; t <= tc; t++) {
solve();
}
}
| # | 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... |