#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n, q;
int h[maxn], a[maxn], b[maxn];
vector <pair <int, int>> ask[maxn];
struct Node{
int max_delta, min_val, max_val;
Node(){
max_delta = - 2e9;
min_val = 2e9;
max_val = - 2e9;
}
friend Node operator + (Node a, Node b){
Node ans;
ans.max_delta = max(a.max_delta, b.max_delta);
ans.min_val = min(a.min_val, b.min_val);
ans.max_val = max(a.max_val, b.max_val);
return ans;
}
} st[4 * maxn];
vector <int> op[maxn], cl[maxn];
int lazy_max[4 * maxn], lazy_min[4 * maxn], ans[maxn];
void apply(int id, int val_max, int val_min){
if(st[id].max_val != - 2e9){
if(val_max != - 2e9)
st[id].max_delta = max(st[id].max_delta, abs(val_max - st[id].max_val));
if(val_min != 2e9)
st[id].max_delta = max(st[id].max_delta, abs(val_min - st[id].max_val));
}
if(st[id].min_val != 2e9){
if(val_max != - 2e9)
st[id].max_delta = max(st[id].max_delta, abs(val_max - st[id].min_val));
if(val_min != 2e9)
st[id].max_delta = max(st[id].max_delta, abs(val_min - st[id].min_val));
}
lazy_max[id] = max(lazy_max[id], val_max);
lazy_min[id] = min(lazy_min[id], val_min);
}
void pushDown(int id){
if(lazy_max[id] != - 2e9 && lazy_min[id] != 2e9){
apply(id << 1, lazy_max[id], lazy_min[id]);
apply(id << 1 | 1, lazy_max[id], lazy_min[id]);
lazy_max[id] = - 2e9;
lazy_min[id] = 2e9;
}
}
void upPoint(int pos, int type, int id = 1, int l = 1, int r = n){
if(pos < l || pos > r) return;
if(l == r){
if(type == 0){
st[id].max_val = - 2e9;
st[id].min_val = 2e9;
} else{
st[id].max_val = st[id].min_val = h[pos];
st[id].max_delta = - 2e9;
}
return;
}
pushDown(id);
int mid = (l + r) >> 1;
upPoint(pos, type, id << 1, l, mid);
upPoint(pos, type, id << 1 | 1, mid + 1, r);
st[id] = st[id << 1] + st[id << 1 | 1];
}
void update(int id, int l, int r, int u, int v, int val){
if(l > v || r < u) return;
if(l >= u && r <= v){
apply(id, val, val);
return;
}
pushDown(id);
int mid = (l + r) >> 1;
update(id << 1, l, mid, u, v, val);
update(id << 1 | 1, mid + 1, r, u, v, val);
st[id] = st[id << 1] + st[id << 1 | 1];
}
Node get(int id, int l, int r, int u, int v){
if(l > v || r < u) return Node();
if(l >= u && r <= v) return st[id];
pushDown(id);
int mid = (l + r) >> 1;
return get(id << 1, l, mid, u, v) + get(id << 1 | 1, mid + 1, r, u, v);
}
int32_t main(){
ios_base::sync_with_stdio(0); cin.tie(0);
#define koa "phatmang"
if(fopen(koa".inp", "r")){
freopen(koa".inp", "r", stdin); freopen(koa".out", "w", stdout);
}
cin >> n;
for(int i = 1; i <= n; i++){
cin >> h[i] >> a[i] >> b[i];
if(a[i] + i <= n){
op[a[i] + i].push_back(i);
}
if(b[i] + i + 1 <= n){
cl[b[i] + i + 1].push_back(i);
}
}
cin >> q;
for(int i = 1; i <= q; i++){
int l, r; cin >> l >> r;
ask[r].push_back(make_pair(l, i));
}
for(int i = 1; i <= 4 * n; i++){
st[i] = Node();
lazy_max[i] = - 2e9;
lazy_min[i] = 2e9;
}
for(int i = 1; i <= n; i++){
for(int &id : op[i]){
upPoint(id, 1);
}
for(int &id : cl[i]){
upPoint(id, 0);
}
if(i - a[i] >= 1){
update(1, 1, n, max(1, i - b[i]), i - a[i], h[i]);
}
for(auto it : ask[i]){
int l = it.first, id = it.second;
ans[id] = get(1, 1, n, l, i).max_delta;
}
}
for(int i = 1; i <= q; i++){
cout << (ans[i] == - 2e9 ? - 1 : ans[i]) << "\n";
}
return 0;
}
Compilation message (stderr)
antennas.cpp: In function 'int32_t main()':
antennas.cpp:97:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
97 | freopen(koa".inp", "r", stdin); freopen(koa".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
antennas.cpp:97:48: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
97 | freopen(koa".inp", "r", stdin); freopen(koa".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~| # | 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... |