#include <bits/stdc++.h>
#define fi first
#define endl '\n'
#define se second
#define int long long
#define getName(x) #x
#define vi std::vector<int>
#define isz(v) (int) v.size()
#define pii std::pair<int, int>
#define all(v) v.begin(), v.end()
#define loop cerr << "here" << endl;
#define breakLoop if(TIME > 1) break;
#define TIME 1.0 * clock() / CLOCKS_PER_SEC
using namespace std;
typedef long long ll;


template <typename T> void maximize(T &a, T b){if(a < b) a = b;}
template <typename T> void minimize(T &a, T b){if(a > b) a = b;}

int f1[20007][502], f2[20007][502];
int n, t, maxw, ans[200007], cnt;
pii a[20007];
struct info{
    int L, R, maxw, idx;
};vector<info> q[200005];
bool check[20005];

void dnc(int L, int R){
    int mid = L + R >> 1;
    if(check[mid]) return;
    for(int i = L - 1; i <= R + 1; i++)
        for(int j = 0; j <= maxw; j++) f1[i][j] = f2[i][j] = 0;
    check[mid] = 1;
    
    for(int i = mid + 1; i <= R; i++){
        for(int j = 1; j <= maxw; j++){
            f2[i][j] = f2[i - 1][j];
            if(j >= a[i].fi){
                maximize(f2[i][j], f2[i - 1][j - a[i].fi] + a[i].se);
            }
        }
    }
    for(int i = mid; i >= L; i--){
        for(int j = 1; j <= maxw; j++){
            f1[i][j] = f1[i + 1][j];
            if(j >= a[i].fi){
                maximize(f1[i][j], (f1[i + 1][j - a[i].fi] + a[i].se) );
            }
        }
    }
    vector<info> left, right;

    for(auto i : q[mid]){
        if(i.L < L or i.R > R) continue;
        if(i.R < mid) left.push_back(i);
        if(i.L > mid) right.push_back(i);
        if(i.L < L or i.R > R or i.R < mid or i.L > mid) continue;
        cnt++;
        for(int w = 0; w <= i.maxw; w++)
            maximize(ans[i.idx], (f2[i.R][w] + f1[i.L][i.maxw - w]));
    }
    if(L == R or cnt == t) return;
    dnc(L, mid);
    dnc(mid + 1, R);

}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    #define task "t"
    if (fopen(task".inp", "r")){
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }

    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i].fi >> a[i].se;
    }
    cin >> t;
    for(int i = 1; i <= t; i++){
        int L, R, limW;
        cin >> L >> R >> limW; maximize(maxw, limW);
        int lo = 1, hi = n, pos;
        while(lo <= hi){
            int mid = lo + hi >> 1;
            if(mid > R) hi = mid;
            else if(mid < L) lo = mid + 1;
            else{
                pos = mid;
                break;
            }
        }
        q[pos].push_back({L, R, limW, i});
    }
    //for(int i = 0; i <= n + 1; i++) f1[i].assign(maxw + 2, 0), f2[i].assign(maxw + 2, 0);

    dnc(1, n);
    for(int i = 1; i <= t; i++) cout << ans[i] << endl;

}
