func_code_string: #include <bits/stdc++.h>   using namespace std;   int const MAX = 1e5 + 41;   int n;   int q;   int s[MAX];   int m[MAX];   int r[MAX];   int const BLOCK = 441;   bool sp[MAX];   int lt[MAX];   int ltb[MAX];   vector<pair<int, int> > a[MAX];   vector<long long> prefsum[MAX];   vector<long long> prefspeed[MAX];   int const INF = 2e9 + 41;   void init() {     for (int i = 0, k = 0; i < n; i += BLOCK, k++) {       for (int j = 0; j <= BLOCK - 1; j++) {         if (i + j >= n) break;         int m = ::m[i + j];         int r = ::r[i + j];         if (r != 0) {           a[k].push_back(make_pair((m + r - 1) / r, i + j));         } else {           a[k].push_back(make_pair(INF, i + j));         }       }       sort(a[k].begin(), a[k].end());       long long sm = 0;       long long sr = 0;       for (int j = 0; j <= (int)a[k].size() - 1; j++) {         int m = ::m[a[k][j].second];         int r = ::r[a[k][j].second];         sm += m;         sr += r;         prefsum[k].push_back(sm);         prefspeed[k].push_back(sr);       }     }   }   long long queryblock(int id, int t) {     long long res = 0;     int p = (int)(lower_bound(a[id].begin(), a[id].end(),                               make_pair(t - ltb[id], INF)) -                   a[id].begin());     p--;     if (p >= 0) {       res += prefsum[id][p];     }     res += prefspeed[id].back() * (t - ltb[id]);     if (p >= 0) {       res -= prefspeed[id][p] * (t - ltb[id]);     }     ltb[id] = t;     return res;   }   long long bruteblock(int id, int l, int r, int t) {     if (l > r) return 0LL;     l -= BLOCK * id;     r -= BLOCK * id;     sp[id] = false;     int sh = id * BLOCK;     for (int i = 0; i <= (int)a[id].size() - 1; i++) {       lt[sh + i] = max(lt[sh + i], ltb[id]);     }     long long res = 0;     for (int i = l; i <= r; i++) {       long long add = min((long long)m[sh + i],                           (long long)::r[sh + i] * (t - lt[sh + i]) + s[sh + i]);       res += add;       lt[sh + i] = t;       s[sh + i] = 0;     }     return res;   }   int getblockright(int x) {     int res = (x / BLOCK + 1) * BLOCK - 1;     res = min(res, n - 1);     return res;   }   int getblockleft(int x) { return x / BLOCK * BLOCK; }   void solve() {     init();     scanf( %d , &q);     for (int o = 1; o <= q; o++) {       int t, l, r;       scanf( %d %d %d , &t, &l, &r);       l--;       r--;       long long res = 0;       int rl = min(r, getblockright(l));       res += bruteblock(l / BLOCK, l, rl, t);       l = rl + 1;       int lr = max(l, getblockleft(r));       res += bruteblock(r / BLOCK, lr, r, t);       r = lr;       while (l < r) {         if (sp[l / BLOCK]) {           res += queryblock(l / BLOCK, t);         } else {           res += bruteblock(l / BLOCK, l, l + BLOCK - 1, t);           sp[l / BLOCK] = 1;           ltb[l / BLOCK] = t;         }         l += BLOCK;       }       printf( %lld n , res);     }   }   int main() {     scanf( %d , &n);     for (int i = 0; i <= n - 1; i++) {       scanf( %d %d %d , &s[i], &m[i], &r[i]);     }     solve();     return 0;   }   