/*
ЗАПУСКАЕМ 
░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░
▄███▀░◐░░░▌░░░░░░░
░░░░▌░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▐░░░░░▐░░░░░░░
░░░░▌░░░░░▐▄▄░░░░░
░░░░▌░░░░▄▀▒▒▀▀▀▀▄
░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄
░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄
░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░░░▌▌░▌▌░░░░░
░░░░░░░░░▄▄▌▌▄▌▌░░░░░ 
 */
#include <iostream>
#include <complex>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
#include <numeric>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <list>
#include <cmath>
#include <bitset>
#include <cassert>
#include <queue>
#include <stack>
#include <deque>
#include <random>


using namespace std;
template<typename T1, typename T2> inline void chkmin(T1 &a, T2 b) {if (a > b) a = b;}
template<typename T1, typename T2> inline void chkmax(T1 &a, T2 b) {if (a < b) a = b;}
#define files(FILENAME) read(FILENAME); write(FILENAME)
#define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin)
#define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout)
#define all(c) (c).begin(), (c).end()
#define sz(c) (int)(c).size()
#define left left228
#define right right228
#define y1 y1228
#define mp make_pair
#define pb push_back
#define y2 y2228
#define rank rank228
using ll = long long;
using ld = long double;
const string FILENAME = "input";
const int MAXN = 600228;




int n;
int v[MAXN], w[MAXN];
int q;
int ans[MAXN];
vector<pair<int, int> > z[MAXN];


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
 	//read(FILENAME);
 	cin >> n;
 	for (int i = 1; i <= n; i++) {
 		cin >> v[i] >> w[i];
 	}
	cin >> q;
	for (int it = 0; it < q; it++) {
		int vv;
		cin >> vv;
		int maxw;
		cin >> maxw;
		z[vv].pb(mp(maxw, it));
	}
	for (int is = 1; is <= n; is++) {
		if (z[is].empty()) {
			continue;
		}
		int vv = is;
		vector<int> st;
		while (vv) {
			st.pb(vv);
			vv >>= 1;
		}
		if (sz(st) == 1) {
			for (auto x: z[is]) {
				if (w[st[0]] <= x.first) {
					ans[x.second] =  v[st[0]];
				} 
			}
		} else {
			vector<pair<int, int> > sts, sts1;
			sts.pb(mp(0, 0));
			sts1.pb(mp(0, 0));
			for (int j = 0; j < sz(st) / 2; j++) {
				vector<pair<int, int> > sts2, ys;
				for (auto x: sts) {
					sts2.pb(mp(x.first + w[st[j]], x.second + v[st[j]]));
				}
				ys.resize(sz(sts) + sz(sts2));
				merge(all(sts), all(sts2), ys.begin());
				swap(ys, sts);
			}
			for (int i = 0; i < sz(sts); i++) {
				for (auto x: z[is]) {
					if (sts[i].first <= x.first) {
						chkmax(ans[x.second], sts[i].second);
					}
				}
			}
			for (int i = 1; i < sz(sts); i++) {
				chkmax(sts[i].second, sts[i - 1].second);
			}
			for (int j = 0; j < sz(st) - sz(st) / 2; j++) {
				vector<pair<int, int> > sts2, ys;
				for (auto x: sts1) {
					sts2.pb(mp(x.first + w[st[j + sz(st) / 2]], x.second + v[st[j + sz(st) / 2]]));
				}
				ys.resize(sz(sts1) + sz(sts2));
				//cout << sz(sts1) << endl;
				merge(all(sts1), all(sts2), ys.begin());
				swap(ys, sts1);
			}
			for (auto y: z[is]) {
				int uk = sz(sts) - 1;
				for (auto x: sts1) {
					while (uk >= 0 && sts[uk].first + x.first > y.first) {
						uk--;
					}
					if (uk >= 0) {
						chkmax(ans[y.second], sts[uk].second + x.second);
					} else {
						if (x.first <= y.first) {
							chkmax(ans[y.second], x.second);
						}
					}
				}
			}
		}
	}
	for (int it = 0; it < q; it++) {
		cout << ans[it] << '\n';
	}
	return 0;	 	
}


Measured memory_bytes: 23324