#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, int> pii;
typedef pair<ll, ld> pld;
typedef pair<pii, int> ppiii;
typedef pair<pii, ll> ppiil;
typedef pair<pll, ll> pplll;
typedef pair<pli, int> pplii;
typedef vector<vector<ll>> vvl;
typedef vector<vector<int>> vvi;
typedef vector<vector<pll>> vvpll;
#define rep(i, a, b) for (ll i=(a); i<(b); i++)
#define rrep(i, a, b) for (ll i=(a); i>(b); i--)
#define pb push_back
#define tostr to_string
#define mkp make_pair
const ll INF = 1e18;
const ll MOD = 1e9 + 7;

void print(ld out) { cout << fixed << setprecision(12) << out << '\n'; }
template<typename T> void print(T out) { cout << out << '\n'; }
template<typename T1, typename T2> void print(pair<T1, T2> out) { cout << out.first << ' ' << out.second << '\n'; }
template<typename T> void print(vector<T> A) { rep(i, 0, A.size()) { cout << A[i]; cout << (i == A.size()-1 ? '\n' : ' '); } }
template<typename T> void print(set<T> S) { vector<T> A(S.begin(), S.end()); print(A); }

template<typename T> inline bool chmax(T &x, T y) { return (y > x) ? x = y, true : false; }
template<typename T> inline bool chmin(T &x, T y) { return (y < x) ? x = y, true : false; }

ll sum(vector<ll> A) { ll res = 0; for (ll a: A) res += a; return res; }
ll max(vector<ll> A) { ll res = -INF; for (ll a: A) chmax(res, a); return res; }
ll min(vector<ll> A) { ll res = INF; for (ll a: A) chmin(res, a); return res; }

ll toint(string s) { ll res = 0; for (char c : s) { res *= 10; res += (c - '0'); } return res; }
int toint(char c) { return c - '0'; }
char tochar(int i) { return '0' + i; }

inline ll pow(int x, ll n) { ll res = 1; rep(_, 0, n) res *= x; return res; }
inline ll pow(ll x, ll n, int mod) { ll res = 1; while (n > 0) { if (n & 1) { res = (res * x) % mod; } x = (x * x) % mod; n >>= 1; } return res; }

inline ll floor(ll a, ll b) { if (a < 0) { return (a-b+1) / b; } else { return a / b; } }
inline ll ceil(ll a, ll b) { if (a >= 0) { return (a+b-1) / b; } else { return a / b; } }

int popcount(ll S) { return __builtin_popcountll(S); }
ll gcd(ll a, ll b) { return __gcd(a, b); }

int N, Q;
const ll M = 1<<9;
const ll MAXW = 100000;
vector<int> V, W, par;
vvi nodes;
int dp[M+1][MAXW+1];

void dfs(int u, int prev, int depth) {
    if (depth == 9) return;
    rep(w, 0, MAXW+1) {
        chmax(dp[u+1][w], dp[prev+1][w]);
        if (w+W[u] <= MAXW) {
            chmax(dp[u+1][w+W[u]], dp[prev+1][w] + V[u]);
        }
    }
    for (int v : nodes[u]) {
        if (prev == v) continue;
        dfs(v, u, depth+1);
    }
    return;
}

int main() {
    cin.tie(0);
    ios::sync_with_stdio(false);

    cin >> N;
    V.resize(N);
    W.resize(N);
    par.resize(N);
    nodes.resize(N);
    rep(i, 0, N) cin >> V[i] >> W[i];

    int v;
    par[0] = -1;
    rep(u, 2, N+1) {
        v = u / 2;
        nodes[u-1].pb(v-1);
        nodes[v-1].pb(u-1);
        par[u-1] = v - 1;
    }
    dfs(0, -1, 0);

    cin >> Q;
    int x, L, cur, ans, bitln, w;
    vector<int> li;
    rep(_, 0, Q) {
        cin >> x >> L;
        x--;

        li.clear();
        cur = x;
        while (cur != -1) {
            li.pb(cur);
            cur = par[cur];
        }
        if (li.size() <= 9) {
            ans = dp[x+1][L];
            print(ans);
        } else {
            ans = 0;
            bitln = li.size() - 9;
            rep(bit, 0, 1<<bitln) {
                v = w = 0;
                rep(i, 0, bitln) {
                    if (bit>>i & 1) {
                        v += V[li[i]];
                        w += W[li[i]];
                    }
                }
                if (w > L) continue;
                chmax(ans, v + dp[li[bitln]+1][L-w]);
            }
            print(ans);
        }
    }
    return 0;
}


Measured memory_bytes: 219748