#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define st first
#define nd second
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define debug false
struct node {
int minn;
int maks;
int wyn;
};
const int MAXN = 200 * 1000 + 17;
const int INF = 1000 * 1000 * 1000 + 1;
int h[MAXN];
int a[MAXN];
int b[MAXN];
int wyn[MAXN];
vector<pii> zap[MAXN];
node st[4 * MAXN];
int lazy[4 * MAXN];
vector<int> pocz[MAXN];
vector<int> kon[MAXN];
int n, q;
void buduj (int p, int k, int i) {
st[i] = {INF, -INF, -INF};
lazy[i] = INF;
if (p == k) {
return;
}
int sr = (p + k)/ 2;
buduj(p, sr, i * 2);
buduj(sr + 1, k, i * 2 + 1);
}
void szykuj (int i) {
if (lazy[i] != INF) {
if (st[i * 2].maks != -INF) {
st[i * 2].minn = min(st[i * 2].minn, lazy[i]);
st[i * 2].wyn = max(st[i * 2].wyn, st[i * 2].maks - lazy[i]);
lazy[i * 2] = min(lazy[i * 2], lazy[i]);
}
if (st[i * 2 + 1].maks != -INF) {
st[i * 2 + 1].minn = min(st[i * 2 + 1].minn, lazy[i]);
st[i * 2 + 1].wyn = max(st[i * 2 + 1].wyn, st[i * 2 + 1].maks - lazy[i]);
lazy[i * 2 + 1] = min(lazy[i * 2 + 1], lazy[i]);
}
lazy[i] = INF;
}
}
void lacz (int i) {
st[i].minn = min(st[i * 2].minn, st[i * 2 + 1].minn);
st[i].maks = max(st[i * 2].maks, st[i * 2 + 1].maks);
st[i].wyn = max(st[i * 2].wyn, st[i * 2 + 1].wyn);
}
void usun (int p, int k, int ind, int i) {
if (p > ind || k < ind) {
return;
}
if (p == k) {
st[i] = {INF, -INF, -INF};
return;
}
int sr = (p + k)/ 2;
szykuj(i);
usun(p, sr, ind, i * 2);
usun(sr + 1, k, ind, i * 2 + 1);
lacz(i);
}
void dodaj (int p, int k, int ind, int i) {
if (p > ind || k < ind) {
return;
}
if (p == k) {
st[i] = {INF, h[p], -INF};
return;
}
int sr = (p + k)/ 2;
szykuj(i);
dodaj(p, sr, ind, i * 2);
dodaj(sr + 1, k, ind, i * 2 + 1);
lacz(i);
}
void minuj (int p, int k, int a, int b, int w, int i) {
if (p > b || k < a) {
return;
}
if (a <= p && k <= b) {
lazy[i] = min(lazy[i], w);
st[i].minn = min(st[i].minn, lazy[i]);
st[i].wyn = max(st[i].wyn, st[i].maks - st[i].minn);
return;
}
int sr = (p + k)/ 2;
szykuj(i);
minuj(p, sr, a, b, w, i * 2);
minuj(sr + 1, k, a, b, w, i * 2 + 1);
lacz(i);
}
int odczytaj (int p, int k, int a, int b, int i) {
if (p > b || k < a) {
return -INF;
}
if (a <= p && k <= b) {
return st[i].wyn;
}
int sr = (p + k)/ 2;
szykuj(i);
int w1 = odczytaj(p, sr, a, b, i * 2);
int w2 = odczytaj(sr + 1, k, a, b, i * 2 + 1);
lacz(i);
return max(w1, w2);
}
void rozw () {
buduj(1, n, 1);
for (int i = 1; i <= n; i ++) {
pocz[min(i + a[i], MAXN - 1)].pb(i);
kon[min(i + b[i], MAXN - 1)].pb(i);
for (auto x : pocz[i]) {
dodaj(1, n, x, 1);
}
if ((i - a[i]) >= 1) {
minuj(1, n, max(1, i - b[i]), i - a[i], h[i], 1);
}
for (auto x : zap[i]) {
wyn[x.nd] = max(wyn[x.nd], odczytaj(1, n, x.st, i, 1));
}
for (auto x : kon[i]) {
usun(1, n, x, 1);
}
pocz[i].clear();
kon[i].clear();
}
}
int main () {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> h[i] >> a[i] >> b[i];
}
cin >> q;
int l, r;
for (int i = 0; i < q; i ++) {
cin >> l >> r;
zap[r].pb({l, i});
wyn[i] = -1;
}
rozw();
for (int i = 1; i <= n; i ++) {
h[i] *= (-1);
}
rozw();
for (int i = 0; i < q; i ++) {
cout << wyn[i] << "\n";
}
return 0;
}