#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
const int RLEN = 1 << 20 | 1;
inline char gc() {
  static char ibuf[RLEN], *ib, *ob;
  (ob == ib) && (ob = (ib = ibuf) + fread(ibuf, 1, RLEN, stdin));
  return (ob == ib) ? EOF : *ib++;
}
inline int read() {
  char ch = getchar();
  int res = 0, f = 1;
  while (!isdigit(ch)) f ^= ch == '-', ch = getchar();
  while (isdigit(ch)) res = (res + (res << 2) << 1) + (ch ^ 48), ch = getchar();
  return f ? res : -res;
}
inline void chemx(int &a, int b) { a < b ? a = b : 0; }
inline void chemn(int &a, int b) { a > b ? a = b : 0; }
struct node {
  int s, m, r, t;
  node(int _s = 0, int _m = 0, int _r = 0, int _t = 0)
      : s(_s), m(_m), r(_r), t(_t) {}
  friend inline bool operator<(const node &a, const node &b) {
    return a.t < b.t;
  }
  friend inline bool operator==(const node &a, const node &b) {
    return a.t == b.t;
  }
  friend inline bool operator>(const node &a, const node &b) {
    return a.t > b.t;
  }
  friend inline bool operator<=(const node &a, const node &b) {
    return a.t <= b.t;
  }
  friend inline bool operator>=(const node &a, const node &b) {
    return a.t >= b.t;
  }
  friend inline bool operator!=(const node &a, const node &b) {
    return a.t != b.t;
  }
};
const int N = 100005, inf = 2e9;
node a[N];
int n, q;
struct Tr {
  vector<node> v;
  vector<long long> sl, sr;
  int last;
  inline void init(int l, int r) {
    int len = r - l + 1;
    for (int i = l; i <= r; i++) v.push_back(a[i]);
    sort(v.begin(), v.end());
    sl.resize(len), sr.resize(len);
    sl[0] = v[0].m, sr[len - 1] = v[len - 1].r;
    for (int i = 1; i < len; i++) sl[i] = sl[i - 1] + v[i].m;
    for (int i = len - 2; ~i; i--) sr[i] = sr[i + 1] + v[i].r;
  }
  inline long long query(int t) {
    int tim = t - last;
    int pos =
        lower_bound(v.begin(), v.end(), node(0, 0, 0, tim)) - v.begin() - 1;
    long long res = 0;
    if (~pos) res += sl[pos];
    if (pos + 1 < (int)v.size()) res += sr[pos + 1] * tim;
    last = t;
    return res;
  }
};
namespace Seg {
Tr tr[N << 2];
void build(int u, int l, int r) {
  tr[u].last = -2, tr[u].init(l, r);
  if (l == r) return;
  build((u << 1), l, ((l + r) >> 1)),
      build(((u << 1) | 1), ((l + r) >> 1) + 1, r);
}
inline void pushup(int u) {
  if (tr[(u << 1)].last == tr[((u << 1) | 1)].last)
    if (tr[(u << 1)].last >= 0) {
      tr[u].last = tr[(u << 1)].last;
      return;
    } else if (tr[(u << 1)].last == -2) {
      tr[u].last = -2;
      return;
    }
  tr[u].last = -1;
}
inline void pushdown(int u) {
  if (tr[u].last >= 0) tr[(u << 1)].last = tr[((u << 1) | 1)].last = tr[u].last;
}
long long query(int u, int l, int r, int st, int des, int k) {
  if (l == r && tr[u].last == -2) {
    tr[u].last = k;
    return min(1ll * a[l].m, 1ll * a[l].s + 1ll * a[l].r * k);
  }
  if (st <= l && r <= des && tr[u].last >= 0) return tr[u].query(k);
  long long res = 0;
  pushdown(u);
  if (st <= ((l + r) >> 1))
    res += query((u << 1), l, ((l + r) >> 1), st, des, k);
  if (((l + r) >> 1) < des)
    res += query(((u << 1) | 1), ((l + r) >> 1) + 1, r, st, des, k);
  pushup(u);
  return res;
}
}  // namespace Seg
int main() {
  n = read();
  for (int i = 1; i <= n; i++) {
    a[i].s = read(), a[i].m = read(), a[i].r = read(),
    a[i].t = a[i].r == 0 ? inf : a[i].m / a[i].r;
  }
  Seg::build(1, 1, n);
  q = read();
  while (q--) {
    int t = read(), l = read(), r = read();
    cout << Seg::query(1, 1, n, l, r, t) << '\n';
  }
}
