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

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define trav(a, x) for (auto& a : (x))
#define all(x) x.begin(), x.end() // sort(all(x))
#define sz(x) (int)(x).size()
#define mp(x, y) make_pair((x), (y))

typedef long long ll;

typedef double T;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> tiii;

typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef vector<T> vt;
typedef vector<vt> vvt;
typedef vector<pii> vpi;
typedef vector<pii> vpl;
typedef vector<vpi> graph;
typedef complex<T> Pt;
typedef pair<Pt, Pt> Line;

const ll MOD = 1e9 + 7; // 998244353;
const T EPS = 1e-10;
const int INF = 1e9 + 1;

/* Mod Library */

struct Mod {
    ll x;
    Mod (ll x = 0) : x(x) {}
    Mod operator+(Mod b) { return Mod((x + b.x)%MOD); }
    Mod operator-(Mod b) { return Mod((x - b.x + MOD)%MOD); }
    Mod operator*(Mod b) { return Mod((x * b.x)%MOD); }
    Mod operator/(Mod b) { return *this * inverse(b); }
    Mod operator%(Mod b) { return Mod(x % b.x); }

    static ll euclid(ll a, ll b, ll &x, ll &y) {
        if (b) {
            ll d = euclid(b, a%b, y, x);
            y -= a/b*x;
            return d;
        }
        x = 1; 
        y = 0;
        return a;
    }
    
    Mod inverse(Mod a) {
        ll x, y, g = euclid(a.x, MOD, x, y);
        assert(g == 1);
        return Mod((x + MOD)%MOD);
    }

    Mod operator^(ll e) {
        if (!e) return Mod(1);
        Mod r = *this^(e/2);
        r = r*r;
        return e&1 ? *this*r : r;
    }
};

/* Input Library */
template <typename A, typename B>
istream& operator>>(istream &in, pair<A, B> &p) {
    in >> p.first >> p.second;
    return in;
}

template <typename A, typename B>
ostream& operator<<(ostream &out, pair<A, B> &p) {
    out << p.first << " " << p.second;
    return out;
}

template <typename I>
istream& operator>>(istream &in, vector<I> &a) {
    trav(i, a) in >> i;
    return in;
}

template <typename I>
ostream& operator<<(ostream &out, vector<I> &a) {
    rep(i, 0, sz(a)) {
        if (i) out << " ";
        out << a[i];
    }
    return out;
}

void fast_io() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    //cout.tie(0);
    cin.exceptions(cin.failbit);
} 

void solve_test() {
  int n;
  cin >> n;
  vi v(n+1, 0), w(n+1, 0); 
  for (int i = 1; i <= n; ++i) {
    cin >> v[i] >> w[i];
  }
  int W = 1e5;
  int k = min(n, 512);
  vvi a(k+1, vi(W+1, 0));
  for (int i = w[1]; i <= W; ++i) {
    a[1][i] = v[1];
  }
  for (int i = 2; i <= k; ++i) {
    int prev = i/2;
    for (int j = 1; j <= W;++j) {
      a[i][j] = max(a[prev][j], a[i][j-1]);
      if (j >= w[i]) {
        a[i][j] = max(a[i][j], a[prev][j-w[i]] + v[i]);
      }
    }
  }

  int q; 
  cin >> q;
  vector<pii> subsets(2049);
  while (q--) {
    int x, l;
    cin >> x >> l;
    if (x <= k) {
      cout << a[x][l] << endl;
      continue;
    }

    vector<int> st;
    while (x > k) {
      st.push_back(x);
      x /= 2;
    }

    subsets[0] = {0, 0};
    int it = 1;
    int ans = a[x][l];
    for (auto &el : st) {
      int prev_it = it;
      for (int i = 0; i < prev_it; ++i) {
        int vv = subsets[i].first + v[el];
        int ww = subsets[i].second + w[el];

        if (ww <= l) {
          ans = max(ans, vv + a[x][l - ww]);
        }

        subsets[it].first = vv;
        subsets[it++].second = ww;
      }
    }
    cout << ans << endl;
  }
}

void setup() {
}

int main() {
    setup();
    srand(time(0));
    fast_io();
    int t = 1;
    //cin >> t;
    while (t--) {
        solve_test();
    }
}


Measured memory_bytes: 206720