#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void rread(T& num) {
  num = 0;
  T f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') num = num * 10 + ch - '0', ch = getchar();
  num *= f;
}
const int inf = 2e9, mod = 1e9 + 7;
const int maxn = 2e5 + 10;
const long double PI = acos(-1.0);
long long gcd(long long a, long long b) { return (a ? gcd(b % a, a) : b); }
void exgcd(long long a, long long b, long long& d, long long& x, long long& y) {
  if (!b) {
    d = a;
    x = 1;
    y = 0;
  } else {
    exgcd(b, a % b, d, y, x);
    y -= x * (a / b);
  }
}
long long power(long long a, long long n) {
  long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
    }
    n >>= 1;
    a *= a;
  }
  return p;
}
long long power(long long a, long long n, long long mod) {
  long long p = 1;
  while (n > 0) {
    if (n % 2) {
      p = p * a;
      p %= mod;
    }
    n >>= 1;
    a *= a;
    a %= mod;
  }
  return p % mod;
}
int n, m;
long long p[maxn], l[maxn];
int flag[maxn];
long long sum[maxn];
int maa[maxn];
long long la[maxn];
long long ans[maxn];
int flv[maxn];
pair<pair<int, int>, int> pp[maxn];
struct node {
  int r, l;
  int maxx;
  long long le;
} se[maxn << 2];
void build(int tr, int l, int s) {
  se[tr].r = s;
  se[tr].l = l;
  se[tr].maxx = 0;
  int mid = (s + l) / 2;
  if (s == l) {
    se[tr].le = p[s];
    return;
  }
  build(tr * 2, l, mid);
  build(tr * 2 + 1, mid + 1, s);
  se[tr].le = max(se[tr << 1].le, se[tr << 1 | 1].le);
  return;
}
void inse(int tr, int i, int d, long long lee) {
  if (se[tr].l == se[tr].r) {
    se[tr].le = lee;
    se[tr].maxx = d;
    return;
  }
  int mid = (se[tr].r + se[tr].l) / 2;
  if (i <= mid)
    inse(tr * 2, i, d, lee);
  else
    inse(tr * 2 + 1, i, d, lee);
  se[tr].maxx = max(se[tr * 2 + 1].maxx, se[tr * 2].maxx);
  se[tr].le = max(se[tr << 1].le, se[tr << 1 | 1].le);
  return;
}
int querymax(int tr, int i, int j, long long& gg) {
  if (se[tr].l >= i && se[tr].r <= j) {
    gg = se[tr].le;
    return se[tr].maxx;
  }
  int mid = (se[tr].r + se[tr].l) >> 1;
  int s1 = -1, s2 = -1;
  long long g1 = -1, g2 = -1;
  if (i <= mid) s1 = querymax(tr << 1, i, j, g1);
  if (j > mid) s2 = querymax(tr << 1 | 1, i, j, g2);
  gg = max(g1, g2);
  return max(s1, s2);
}
struct node2 {
  int r, l;
  int tag;
  int be;
} se2[maxn << 2];
void build2(int tr, int l, int s) {
  se2[tr].r = s;
  se2[tr].l = l;
  se2[tr].be = 0;
  se2[tr].tag = 0;
  int mid = (s + l) / 2;
  if (s == l) {
    return;
  }
  build2(tr * 2, l, mid);
  build2(tr * 2 + 1, mid + 1, s);
  return;
}
void pushh(int tr) {
  if (se2[tr].tag != 0 && se2[tr].l != se2[tr].r) {
    se2[tr << 1].tag = se2[tr].tag;
    se2[tr << 1 | 1].tag = se2[tr].tag;
    se2[tr << 1].be = se2[tr].tag;
    se2[tr << 1 | 1].be = se2[tr].tag;
    se2[tr].tag = 0;
  }
}
void inse2(int tr, int i, int j, int d) {
  if (se2[tr].l >= i && se2[tr].r <= j) {
    se2[tr].be = d;
    se2[tr].tag = d;
    return;
  }
  int mid = (se2[tr].r + se2[tr].l) / 2;
  pushh(tr);
  if (i <= mid) inse2(tr * 2, i, j, d);
  if (j > mid) inse2(tr * 2 + 1, i, j, d);
  return;
}
int query2(int tr, int i) {
  if (se2[tr].l == se2[tr].r) {
    return se2[tr].be;
  }
  int mid = (se2[tr].r + se2[tr].l) >> 1;
  pushh(tr);
  if (i <= mid)
    return query2(tr << 1, i);
  else
    return query2(tr << 1 | 1, i);
}
int main() {
  while (~scanf("%d", &n)) {
    for (int i = 1; i <= n; i++) {
      scanf("%lld%lld", &p[i], &l[i]);
    }
    long long ma = 0, cur = 0;
    build(1, 1, n);
    for (int i = n; i >= 1; i--) {
      int d = upper_bound(p + i + 1, p + 1 + n, p[i] + l[i]) - p;
      long long g = 0;
      d--;
      int ss = 0;
      if (d != i && i + 1 <= d) ss = querymax(1, i + 1, d, g);
      d = max(d, ss);
      g = max(g, p[i] + l[i]);
      inse(1, i, d, g);
      maa[i] = d;
      la[i] = g;
      if (d < n)
        sum[i] = sum[d + 1] + p[d + 1] - g;
      else
        sum[i] = 0;
    }
    build(1, 1, n);
    scanf("%d", &m);
    for (int i = 1; i <= m; i++) {
      scanf("%lld%lld", &pp[i].first.first, &pp[i].first.second);
      pp[i].second = i;
    }
    build2(1, 1, n);
    sort(pp + 1, pp + 1 + m);
    cur = n;
    long long ss = sum[1];
    for (int i = m; i >= 1; i--) {
      long long dd = pp[i].first.first;
      if (dd != cur) {
        for (int j = cur; j >= dd; j--) {
          inse2(1, j, maa[j], j);
        }
        cur = dd;
      }
      int gs = query2(1, pp[i].first.second);
      ans[pp[i].second] = sum[pp[i].first.first] - sum[gs];
    }
    for (int i = 1; i <= m; i++) cout << ans[i] << endl;
  }
  return 0;
}
