#include <bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
#define pb push_back
#define sz(x) (int)x.size()
#define iii tuple<int,int,int>
#define pll pair<int,int>
struct node {
int s, e, m;
int c, d, ans, lz;
node *l, *r;
node (int S, int E){
s=S, e=E, m=(S+E)/2, c=-1e18, d=1e18, ans=-1, lz=1e18;
if(s!=e){
l=new node(s, m);
r=new node(m+1, e);
}
}
void prop(){
if(s==e or lz==1e18)return;
if(l->c > 0){
l->lz=min(l->lz, lz);
l->ans=max(l->ans, l->c-lz);
}
if(r->c > 0) {
r->lz=min(r->lz, lz);
r->ans=max(r->ans, r->c-lz);
}
lz=1e18;
}
void set(int x, int v){
if(s==e){
c=v;
//ans=max(ans, c-d);
//printf("segment %lld to %lld, c %lld, d %lld, ans %lld\n", s,e,c,d,ans);
return;
}
prop();
if(x <= m)l->set(x, v);
else r->set(x, v);
c=max(l->c, r->c);
//if(c<0)d=1e18;
//ans=max({ans, c-d, l->ans, r->ans});
//printf("segment %lld to %lld, c %lld, d %lld, ans %lld\n", s,e,c,d,ans);
}
void chmin(int S, int E, int v){
if(S <= s and e<=E) {
//if (c > 0) {
lz=min(lz, v);
ans=max(ans, c-lz);
//}
//printf("segment %lld to %lld, c %lld, d %lld, ans %lld\n", s,e,c,d,ans);
return;
}
prop();
if(E <= m) l->chmin(S, E, v);
else if(S > m) r->chmin(S, E, v);
else{
l->chmin(S, m, v);
r->chmin(m+1, E, v);
}
ans=max({ans, l->ans, r->ans});
//printf("segment %lld to %lld, c %lld, d %lld, ans %lld\n", s,e,c,d,ans);
}
int qry(int S, int E){
//printf("s %lld e %lld S %lld E %lld\n",s,e,S,E);
if(S <= s and e <= E){
return ans;
}
prop();
if(E <= m) return l->qry(S, E);
if(S > m) return r->qry(S, E);
return max(l->qry(S, m), r->qry(m+1, E));
}
} *root;
vector<int> solve(vector<int> h, vector<pll> d, vector<pll> qs){
int n=sz(h), q=sz(qs);
root = new node(0, n-1);
vector<vector<pll>> todo(n), qep(n);
vector<int> ans(q, 0);
for(int i=0;i<n;i++){
auto [a, b] = d[i];
if(i + a < n) todo[i+a].pb({i, 1});
if(i + b + 1 < n) todo[i+b+1].pb({i, -1});
}
for(int i=0;i<q;i++){
qep[qs[i].s].pb({qs[i].f, i});
}
for (int x=0;x<n;x++){
//printf(" --------- %lld ----------\n", x);
for (auto [i, t] : todo[x]){
//printf("setting %lld , t %lld\n", i, t);
if(t==1){
root->set(i, h[i]);
}
else {
root->set(i, -1e18);
}
}
int l=max(0ll, x-d[x].s), r=max((int)-1, x-d[x].f);
if(r >= l){
//printf("chminning %lld %lld %lld\n", l, r, h[x]);
root->chmin(l, r, h[x]);
}
for (auto [l, qind] : qep[x]){
//printf("qrying %lld to %lld qind %lld\n", l, x, qind);
ans[qind]=root->qry(l, x);
}
}
return ans;
}
signed main(){
int n,q;cin>>n;
vector<int> h(n);
vector<pll> d(n);
for(int i=0;i<n;i++) cin>>h[i]>>d[i].f>>d[i].s;
cin>>q;
vector<pll> qs(q);
for(int i=0;i<q;i++) {
cin>>qs[i].f>>qs[i].s;
qs[i].f--, qs[i].s--;
}
vector<int> a1(q, -1), a2(q, -1);
a1=solve(h, d, qs);
reverse(h.begin(),h.end());
reverse(d.begin(),d.end());
for(int i=0;i<q;i++){
qs[i]={n-qs[i].s-1, n-qs[i].f-1};
}
a2=solve(h, d, qs);
for(int i=0;i<q;i++){
cout<<max(a1[i], a2[i])<<'\n';
}
}