/*
in the name of god
*/
//#pragma GCC optimize("Ofast,O3,unroll-loops")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,sse4a,avx,avx2,popcnt,tune=native")
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
typedef pair<long long ,long long> pll;
typedef long long ll ;
#define File freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#define all(V) V.begin(),V.end()
#define setprec(x) fixed << setprecision(x)
#define Mp(a,b) make_pair(a,b)
#define len(V) (int)(V.size())
#define sep ' '
#define endl '\n'
#define pb push_back
#define fi first
#define sec second
#define popcount(x) __builtin_popcount(x)
#define lid u<<1
#define rid (lid)|1
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll N = 6e5 + 10,SQ=320,LOG=31;
const ll inf = 1e9 + 10 , MD = 1e9 + 7;
inline ll md(ll x){ x %= MD; return (x < 0 ? x + MD : x);}
int n , q;
int arr[N];
int a[N],b[N];
vector<pii> Q[N];
int ans[N];
vector<int> L[N],R[N];
struct node{
int ans,mn,mx,lazymn,lazymx;
node(){}
} seg[N<<2];
node merge(const node& a,const node& b){
node ans;
ans.ans = max(a.ans,b.ans);
ans.mn = min(a.mn,b.mn);
ans.mx = max(a.mx,b.mx);
ans.lazymn = inf;
ans.lazymx = -inf;
return ans;
}
void shiftmx(int u,int v){
seg[u].lazymx = max(seg[u].lazymx,v);
seg[u].ans = max(seg[u].ans,v - seg[u].mn);
}
void shiftmn(int u,int v){
seg[u].lazymn = min(seg[u].lazymn,v);
seg[u].ans = max(seg[u].ans,seg[u].mx - v);
}
void relax(int u){
shiftmx(lid,seg[u].lazymx);
shiftmx(rid,seg[u].lazymx);
shiftmn(lid,seg[u].lazymn);
shiftmn(rid,seg[u].lazymn);
seg[u].lazymx = -inf;
seg[u].lazymn = inf;
}
void build(int u=1,int l=1,int r=n+1){
if(r-l==1){
seg[u].ans = -inf;
seg[u].mn = inf;
seg[u].mx = -inf;
seg[u].lazymn = inf;
seg[u].lazymx = -inf;
return;
}
int mid = (l+r)>>1;
build(lid,l,mid);
build(rid,mid,r);
seg[u] = merge(seg[lid],seg[rid]);
}
void update(int s,int e,int x,int u=1,int l=1,int r=n+1){
if(e <= s || e <= l || r <= s) return;
if(s <= l && r <= e){
shiftmx(u,x);
shiftmn(u,x);
return ;
}
int mid = (l+r)>>1;
relax(u);
update(s,e,x,lid,l,mid);
update(s,e,x,rid,mid,r);
seg[u] = merge(seg[lid],seg[rid]);
}
node get(int s,int e,int u=1,int l=1,int r=n+1){
if(s <= l && r <= e){
return seg[u];
}
int mid = (l+r)>>1;
relax(u);
if(e <= mid) return get(s,e,lid,l,mid);
if(s >= mid) return get(s,e,rid,mid,r);
return merge(get(s,e,lid,l,mid),get(s,e,rid,mid,r));
}
void change(int i,int v,int u=1,int l=1,int r=n+1){
if(r-l==1){
if(v != -1){
seg[u].mx = seg[u].mn = v;
}
else{
seg[u].mx = -inf;
seg[u].mn = inf;
}
return;
}
int mid = (l+r)>>1;
relax(u);
(i < mid ? change(i,v,lid,l,mid) : change(i,v,rid,mid,r));
seg[u] = merge(seg[lid],seg[rid]);
}
int32_t main() {
ios_base::sync_with_stdio(false);cout.tie(0);cin.tie(0);
cin >> n ;
for(int i =1 ;i <= n;i++){
cin >> arr[i] >> a[i] >> b[i];
L[i + a[i]].pb(i);
R[i + b[i]].pb(i);
}
cin >> q;
for(int i =1 ;i <= q;i++){
int l,r;
cin >> l >> r;
Q[r].pb({l,i});
}
fill(ans,ans+q+1,-inf);
build();
for(int i =1 ;i <= n;i++){
for(auto h : L[i]){
change(h,arr[h]);
}
int l = i - b[i];
int r = i - a[i];
if(r >= 1){
// cout << "baze " << i << sep << l << sep << r << endl;
l = max(l,1);
update(l,r+1,arr[i]);
}
for(auto h : Q[i]){
ans[h.sec] = max(ans[h.sec],get(h.fi,i+1).ans);
}
// cout << i << " -- " << endl;
// for(int j = 1;j <= n;j++) cout << get(j,j+1).lazymn << sep;
// cout << endl;
for(auto h : R[i]){
change(h,-1);
}
}
for(int i = 1;i <= q;i++){
if(ans[i] < 0){
cout << -1 << endl;
}
else cout << ans[i] << endl;
}
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... |