"use strict";
var input = require("fs").readFileSync("/dev/stdin", "utf8");
var cin = input.split(/ |\n/),
    cid = 0;

function next() {
    return +cin[cid++];
} // number一個取得
function nextstr() {
    return cin[cid++];
} // 文字列一個取得
function nextbig() {
    return BigInt(cin[cid++]);
} // BigInteger一個取得
// 長さnの配列として取得。aは文字列フラグ
function nexts(n, a) {
    return a ? cin.slice(cid, cid += n) : cin.slice(cid, cid += n).map(a => +a);
}
// 長さnのBigInt配列として取得。
function nextsbig(n) {
    return cin.slice(cid, cid += n).map(a => BigInt(a));
}
// w個ずつを組にして長さhの配列。aは文字列フラグ。
function nextm(h, w, a) {
    var r = [],
        i = 0;
    if (a)
        for (; i < h; i++) r.push(cin.slice(cid, cid += w));
    else
        for (; i < h; i++) r.push(cin.slice(cid, cid += w).map(a => +a));
    return r;
}

function xArray(v) {
    var a = arguments,
        l = a.length,
        r = "Array(a[" + --l + "]).fill().map(x=>{return " + v + ";})";
    while (--l) r = "Array(a[" + l + "]).fill().map(x=>" + r + ")";
    return eval(r);
}

var N = next();
var VW = nextm(N, 2); // V ==VW[i][0], W == VW[i][1]
var Q = next()
for (let i = 0; i < Q; i++)
    main()

function main() {
    let v = next();
    let L = next();
    // 頂点の値、価値、の列
    let value = [];
    let weight = [];
    while (v >= 1) {
        value.push(VW[v - 1][0])
        weight.push(VW[v - 1][1])
        v = v >> 1;
    }
    let n = value.length;
    let dp = Array(n + 1)
    for (let i = 0; i < n + 1; i++) {
        dp[i] = Array(L + 1);
    }
    for (let x = 0; x < L + 1; x++) dp[0][x] = 0;

    // console.log({        n,        L,        weight,        value,        dp    })
    for (let i = 0; i < n; i++) {
        for (let w = 0; w <= L; w++) {
           // console.log({ i,    w,             dp            })
            if (w >= weight[i]) {
                dp[i + 1][w] = Math.max(dp[i ][w - weight[i]] + value[i], dp[i][w])
            } else {
                dp[i + 1][w] = dp[i][w]
            }
        }
    }
    console.log(dp[n][L])
}