func_code_string: #include <bits/stdc++.h>   using namespace std;   const int Maxn = 1 << 30;   int n, m, str[100100], lim[100100], up[100100], D[100100], col[100100 * 4];   long long ans;   vector<int> F[100100 * 4];   vector<long long> sum2[100100 * 4], sum[100100 * 4];   bool cmp(int x, int y) { return D[x] > D[y]; }   void build(int node, int l, int r) {     col[node] = -2;     if (l == r) {       F[node].push_back(l);       sum[node].push_back(up[l]);       sum2[node].push_back(lim[l]);       return;     }     int mid = (l + r) >> 1, son = node << 1;     build(son, l, mid);     build(son | 1, mid + 1, r);     F[node].resize(r - l + 1);     sum[node].resize(r - l + 1);     sum2[node].resize(r - l + 1);     merge(F[son].begin(), F[son].end(), F[son | 1].begin(), F[son | 1].end(),           F[node].begin(), cmp);     sum[node][0] = up[F[node][0]], sum2[node][0] = lim[F[node][0]];     for (int i = 1, size = F[node].size(); i < size; i++) {       sum[node][i] = sum[node][i - 1] + up[F[node][i]];       sum2[node][i] = sum2[node][i - 1] + lim[F[node][i]];     }   }   void update(int node) {     if (col[node] > 0) col[node << 1] = col[(node << 1) | 1] = col[node];   }   void getans(int node, int l, int r, int ll, int rr, int t) {     if (l > rr || ll > r) return;     if (ll <= l && rr >= r && (col[node] > 0 || col[node] == -2)) {       if (col[node] > 0) {         int dif = t - col[node];         int l = -1, r = F[node].size() - 1;         while (l < r) {           int mid = (l + r + 1) >> 1;           if (D[F[node][mid]] >= dif)             l = mid;           else             r = mid - 1;         }         if (l >= 0) ans += sum[node][l] * dif - sum2[node][l];         ans += sum2[node][F[node].size() - 1];       } else {         for (int i = 0, size = F[node].size(); i < size; i++)           ans += min((long long)lim[F[node][i]],                      (long long)t * up[F[node][i]] + str[F[node][i]]);       }       col[node] = t;       return;     }     update(node);     int mid = (l + r) >> 1, son = node << 1;     getans(son, l, mid, ll, rr, t);     getans(son | 1, mid + 1, r, ll, rr, t);     if (col[son] == col[son | 1])       col[node] = col[son];     else       col[node] = -1;   }   int main() {     cin >> n;     for (int i = 1; i <= n; i++)       scanf( %d %d %d , &str[i], &lim[i], &up[i]),           D[i] = up[i] == 0 ? Maxn : lim[i] / up[i];     build(1, 1, n);     int t, l, r;     cin >> m;     for (int i = 1; i <= m; i++) {       scanf( %d %d %d , &t, &l, &r);       ans = 0;       getans(1, 1, n, l, r, t);       printf( %lld n , ans);     }   }   