#include <bits/stdc++.h>
using namespace std;
struct ant
{
long long h,a,b;
ant() {}
ant(long long _h,long long _a,long long _b)
{
h=_h;
a=_a;
b=_b;
}
};
long long n;
ant t[200001];
long long q;
pair<long long,long long> p[200001];
void read()
{
cin>>n;
for(long long i=1; i<=n; i++)
{
long long x,y,z;
cin>>x>>y>>z;
t[i]= {x,y,z};
}
cin>>q;
for(long long i=1; i<=q; i++)
{
cin>>p[i].first>>p[i].second;
}
}
struct itv
{
long long first,second,i;
itv() {}
itv(long long f,long long s,long long id)
{
first=f;
second=s;
i=id;
}
};
set<long long> s[800001];
vector<itv> v;
long long len;
bool cmp(itv p1,itv p2)
{
long long b1=p1.first/len;
long long b2=p2.first/len;
if(b1==b2)return p1.second<p2.second;
return b1<b2;
}
long long lf,rt;
void updadd(long long i,long long l,long long r,long long ql,long long qr,long long h)
{
if(ql>qr)return;
s[i].insert(h);
if(l==r)return;
long long 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(long long i,long long l,long long r,long long ql,long long qr,long long h)
{
if(ql>qr)return;
s[i].erase(s[i].find(h));
if(l==r)return;
long long 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(long long i)
{
cout<<"+ "<<i<<endl;
long long l=max(1LL*1,i-t[i].b);
long long r=i-t[i].a;
if(r<0)return;
updadd(1,1,n,l,r,t[i].h);
}
void rem(long long i)
{
cout<<"- "<<i<<endl;
long long l=max(1LL*1,i-t[i].b);
long long r=i-t[i].a;
if(r<0)return;
updrem(1,1,n,l,r,t[i].h);
}
long long query(long long i,long long l,long long r,long long id,long long h)
{
long long 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;
long long 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(long long l)
{
while(lf<l)
{
rem(lf);
lf++;
}
while(l<lf)
{
lf--;
add(lf);
}
}
void fixr(long long r)
{
while(r<rt)
{
rem(rt);
rt--;
}
while(rt<r)
{
rt++;
add(rt);
}
}
void solve()
{
len=(sqrt(n));
for(long long 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});
}
}
long long 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(long long i=lf; i<=rt; i++)
add(i);
ans=query(1,1,n,v[0].i,t[v[0].i].h);
for(long long i=0;i<v.size();i++)
{
long long l=v[i].first;
long long r=v[i].second;
long long 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... |