#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 998244353
#define POT 4194304
#define INF 1000000019
#define INFL 1000000000000000099LL
ll n,q,a,b,c,d;
vector<pair<pair<ll,ll>,ll>>v;//przexial ,wys
ll co[2007][2007];
ll ans[2007][2007];
ll sgtree[POT][3];//dodane,mx,mn
/*void add(ll pocz,ll kon,ll l,ll r,ll v,ll val){
if(l>kon || r<pocz)return;
else if(l<=kon && r>=pocz){
sgtree[v][0]+=val;
sgtree[v][1]+=val;
sgtree[v][2]+=val;
}
else{
sgree[v*2][0]+=sgtree[v][0];
sgree[v*2][1]+=sgtree[v][0];
sgree[v*2+1][0]+=sgtree[v][0];
sgree[v*2+1][1]+=sgtree[v][0];
sgree[v*2][2]+=sgtree[v][0];
sgree[v*2+1][2]+=sgtree[v][0];
sgtree[v][0]=0;
add(pocz,kon,l,(l+r)/2,v*2,val);
add(pocz,kon,(l+r)/2+1,r,v*2,val);
sgtree[v][1]=max(sgtree[v*2][1],sgtree[v*2+1][1]);
sgtree[v][2]=min(sgtree[v*2][2],sgtree[v*2+1][2]);
}
}*/
void add(ll v,ll val){
if(sgtree[v][1]==val){
sgtree[v][1]=-INFL;
sgtree[v][2]=INFL;
}
else{
sgtree[v][1]=val;
sgtree[v][2]=val;}
v/=2;
while(v){
sgtree[v][1]=max(sgtree[v*2][1],sgtree[v*2+1][1]);
sgtree[v][2]=min(sgtree[v*2][2],sgtree[v*2+1][2]);
v/=2;
}
}
ll mx(ll pocz,ll kon,ll l, ll r, ll v){
if(l>kon || r<pocz)return -INFL;
if(l<=kon && r>=pocz)return sgtree[v][1];
return max(mx(pocz,kon,l,(l+r)/2,v*2),mx(pocz,kon,(l+r)/2+1,r,v*2+1));
}
ll mn(ll pocz,ll kon,ll l, ll r, ll v){
if(l>kon || r<pocz)return INFL;
if(l<=kon && r>=pocz)return sgtree[v][2];
return min(mn(pocz,kon,l,(l+r)/2,v*2),mn(pocz,kon,(l+r)/2+1,r,v*2+1));
}
int main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(ll i=0;i<n;i++){
cin>>a>>b>>c;
v.pb({{b,c},a});
}
if(n<=2000){
for(ll i=0;i<n;i++){
for(ll j=0;j<n;j++){
if(v[i].ff.ff<=abs(i-j) && abs(i-j)<=v[i].ff.ss && v[j].ff.ff<=abs(i-j) && abs(i-j)<=v[j].ff.ss){
co[i][j]=abs(v[i].ss-v[j].ss);
}
else{
co[i][j]=-1;
}
}
}
for(ll i=0;i<2007;i++){
for(ll j=0;j<2007;j++)
ans[i][j]=-1;
}
for(ll j=1;j<n;j++){
for(ll i=0;j+i<n;i++){
ans[i][i+j]=max(max(ans[i+1][i+j],ans[i][j+i-1]),co[i][i+j]);
}
}
cin>>q;
// cout<<ans[2][4]<<"\n";
for(ll i=0;i<q;i++){
cin>>a>>b;
a--;
b--;
cout<<ans[a][b]<<"\n";
}
}
else{
for(ll i=0;i<POT;i++){
sgtree[i][1]=-1;
sgtree[i][2]=INFL;
}
ll wyn=-1;
vector<pair<pair<ll,ll>,pair<ll,ll>>>op;//czas,typ, dodaj,policzz,odejmij
for(ll i=0;i<n;i++){
op.pb({{i+1+v[i].ff.ff,-1},{i+1,i+1}});
op.pb({{i+1+v[i].ff.ss,1},{i+1,i+1}});
op.pb({{i+1,0},{i+1-v[i].ff.ff,i+1 -v[i].ff.ss}});
}
sort(op.begin(),op.end());
while(op.size()){
auto pom=op.back();
op.pop_back();
//cout<<pom.ff.ff<<" "<<pom.ff.ss<<" "<<pom.ss.ff<<" "<<pom.ss.ss<<"\n";
if(pom.ff.ss!=0){
add(pom.ss.ss+POT/2-1,(v[pom.ss.ss-1].ss));
}
else{
//cout<<v[pom.ff.ff-1].ss<<" "<<mx(pom.ss.ff,pom.ss.ss,1,POT/2,1)<<" "<<mn(pom.ss.ff,pom.ss.ss,1,POT/2,1) <<" ";
wyn=max(wyn,v[pom.ff.ff-1].ss-mn(pom.ss.ff,pom.ss.ss,1,POT/2,1));
wyn=max(wyn,-v[pom.ff.ff-1].ss+mx(pom.ss.ff,pom.ss.ss,1,POT/2,1));
// cout<<wyn<<" ";
}
}
cout<<wyn<<"\n";
}
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... |