#include <bits/stdc++.h>
using namespace std;
struct ant
{
int h,a,b;
ant() {}
ant(int _h,int _a,int _b)
{
h=_h;
a=_a;
b=_b;
}
};
int n;
ant t[200001];
int q;
pair<int,int> p[200001];
void read()
{
cin>>n;
for(int i=1; i<=n; i++)
{
int x,y,z;
cin>>x>>y>>z;
t[i]= {x,y,z};
}
cin>>q;
for(int i=1; i<=q; i++)
{
cin>>p[i].first>>p[i].second;
}
}
struct itv
{
int first,second,i;
itv() {}
itv(int f,int s,int id)
{
first=f;
second=s;
i=id;
}
};
multiset<int> s[800001];
vector<itv> v;
int len;
bool cmp(itv p1,itv p2)
{
int b1=p1.first/len;
int b2=p2.first/len;
if(b1==b2)return p1.second<p2.second;
return b1<b2;
}
int lf,rt;
void updadd(int i,int l,int r,int ql,int qr,int h)
{
if(ql>qr)return;
if(ql<=l&&r<=qr)
{
s[i].insert(h);
return;
}
int m=(l+r)/2;
updadd(i*2,l,m,ql,min(qr,m),h);
updadd(i*2+1,m+1,r,max(m+1,ql),qr,h);
}
void updrem(int i,int l,int r,int ql,int qr,int h)
{
if(ql>qr)return;
if(ql<=l&&r<=qr)
{
s[i].erase(s[i].find(h));
return;
}
int m=(l+r)/2;
updrem(i*2,l,m,ql,min(qr,m),h);
updrem(i*2+1,m+1,r,max(m+1,ql),qr,h);
}
void add(int i)
{
//cout<<"+ "<<i<<endl;
int l=max(1,i-t[i].b);
int r=i-t[i].a;
if(r<0)return;
updadd(1,1,n,l,r,t[i].h);
}
void rem(int i)
{
//cout<<"- "<<i<<endl;
int l=max(1,i-t[i].b);
int r=i-t[i].a;
if(r<0)return;
updrem(1,1,n,l,r,t[i].h);
}
int query(int i,int l,int r,int id,int h)
{
int ans=-1;
if(s[i].size())
{
auto it=s[i].begin();
ans=abs(h-*it);
it=s[i].end();
it--;
ans=max(ans,abs(h-*it));
}
if(l==r)return ans;
int m=(l+r)/2;
if(id<=m)return max(ans,query(i*2,l,m,id,h));
else return max(ans,query(i*2+1,m+1,r,id,h));
}
void fixl(int l)
{
while(lf<l)
{
rem(lf);
lf++;
}
while(l<lf)
{
lf--;
add(lf);
}
}
void fixr(int r)
{
while(r<rt)
{
rem(rt);
rt--;
}
while(rt<r)
{
rt++;
add(rt);
}
}
void solve()
{
len=(sqrt(n));
for(int i=1; i<=n; i++)
{
if(i+t[i].a<=n)
{
v.push_back({i+t[i].a,min(n,i+t[i].b),i});
}
}
int ans=-1;
if(v.size()==0)
{
cout<<-1<<endl;
exit(0);
}
/*v.clear();
for(int i=1;i<=5;i++)
{
int x,y;
cin>>x>>y;
v.push_back({x,y,i});
}*/
sort(v.begin(),v.end(),cmp);
lf=v[0].first,rt=v[0].second;
for(int i=lf; i<=rt; i++)
add(i);
ans=query(1,1,n,v[0].i,t[v[0].i].h);
for(int i=0;i<v.size();i++)
{
int l=v[i].first;
int r=v[i].second;
int id=v[i].i;
//cout<<l<<" "<<r<<" "<<id<<endl;
if(rt<l)
{
fixr(r);
fixl(l);
}
else
{
fixl(l);
fixr(r);
}
ans=max(ans,query(1,1,n,id,t[id].h));
}
cout<<ans<<endl;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
read();
solve();
return 0;
}
/*
5
10 2 4
1 1 1
2 1 3
1 1 1
100 1 1
5
1 2
2 3
1 3
1 4
1 5
1 3
1 1
4 4
2 5
3 4
*/
| # | 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... |