#include <bits/stdc++.h>
 
using namespace std;
 
#define int long long
 
#define PB	push_back
#define ALL(x)	(x).begin(), (x).end()
#define ALLR(x)	(x).rbegin(), (x).rend()
#define MP	make_pair
 
#define debug(args...) { string _s = #args; replace(ALL(_s), ',', ' '); stringstream ss(_s); cerr << endl;_debug(ss, args); }
#define _rg auto it = next(v.begin()); it != v.end(); it++
#define _input ostream& operator <<(ostream& out
 
template<typename T, typename U>
_input, const pair<T, U>& p) {
	out << "(" << p.first << ", " << p.second << ")";
	return out;
}
 
#define cont(c) template<typename T> _input, const c<T>& v) { \
					if (v.empty()) return out; \
					out << "[" << *v.begin(); \
					for (_rg) out << ", " << *it; \
					out << "]"; return out; \
				}
				
#define cont2(c) template<typename T, typename U> _input, const c<T, U>& v) { \
					if (v.empty()) return out; \
					out << "[" << *v.begin(); \
					for (_rg) out << ", " << *it; \
					out << "]"; return out; \
				}
 
cont(vector) cont(set) cont(multiset) cont(queue) cont2(map)
 
template<typename T, size_t n, typename= enable_if_t<!is_same<T, char>::value>>
_input, const T(&v)[n]) {
	if (n == 0) return out;
	out << "[" << v[0];
	for (int i = 1; i < (int)n; i++) out << ", " << v[i];
	out  << "]"; return out;
}
 
template<typename T, typename... Ts>
void _debug(stringstream& ss, const T &arg) {
	string name; ss >> name;
	cerr << name << " = " << arg << endl;
}
 
template<typename T, typename... Ts>
void _debug(stringstream& ss, const T& arg, const Ts&... args) {
	string name; ss >> name; 
	cerr << name << " = " << arg << ", ";
	if (is_class<T>::value || is_array<T>::value) cerr << endl;
	_debug(ss, args...);
}
 
#define FAST_IO ios::sync_with_stdio(false); cin.tie(0)
 
typedef pair<int, int> ii;
typedef pair<pair<int, int>, int> iii;
typedef vector<int> vi;
typedef vector<iii> viii;
typedef vector<vi> vvi;
typedef vector<ii> vii;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef unsigned long long ull;
 
const int INF = LONG_LONG_MAX/2;
const int NINF = LONG_LONG_MIN/2;
const double PI = 3.141592653589793238;
 
const int N = 100000;
const int K = 9;

int32_t main() {
	FAST_IO;
 
	int n;
	cin >> n;
	
	vi V(n+1), W(n+1);
	for (int i = 1; i <= n; i++) {
		cin >> V[i] >> W[i];
	}
	
	vvi dp((1ll<<K), vi(N+1));
	vi depth(n+1);
	for (int i = 1; i <= n; i++) {
		if (2*i > n) break;
		depth[2*i] = depth[i]+1;
		if (2*i + 1 > n) break;
		depth[2*i+1] = depth[i]+1;
	}
	
	for (int i = 1; i <= n; i++) {
		if (depth[i] >= K) break;
		for (int j = 1; j <= N; j++) {
			dp[i][j] = max(dp[i][j-1], dp[i/2][j]);
			if (j-W[i] < 0) continue;
			dp[i][j] = max(dp[i][j], dp[i/2][j-W[i]]+V[i]);
		}
	}
	//~ for (vi& v: dp) {
		//~ debug(v);
	//~ }
	int q;
	cin >> q;
	while (q-->0) {
		int v, L;
		cin >> v >> L;
		
		if (depth[v] < K) {
			cout << dp[v][L] << endl;
		} else {
			vi path;
			int p = v;
			while (depth[p] >= K) {
				path.PB(p);
				p /= 2;
			}
			int sz = path.size();
			int ans = 0;
			for (int mask = 0; mask < (1ll<<sz); mask++) {
				int weight_sum = 0, value_sum = 0;
				for (int i = 0; i < sz; i++) {
					if (mask&(1ll<<i)) {
						weight_sum += W[path[i]];
						value_sum += V[path[i]];
					}
				}
				if (weight_sum > L) continue;
				ans = max(ans, dp[path.back()/2][L-weight_sum] + value_sum); 
			}
			cout << ans << endl;
		}
	}
}
// g++ -Wall -Wextra -Wshadow -fsanitize=undefined -std=c++17


Measured memory_bytes: 410736