#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <climits>

std::vector<int> v;
std::vector<int> w;
std::vector<std::vector<int>> dp;
int lgN;

int knapsack(int ver,int capa){
 if(capa<0){
  return INT_MIN;
 }
 if(capa==0){
  return 0;
 }
 if(ver<=lgN){
  return dp[ver][capa];
 }else{
  int v0=knapsack(ver/2,capa);
  int v1=knapsack(ver/2,capa-w[ver-1])+v[ver-1];
  
  return std::max(v0,v1);
 }
}

int main(){
 int N;
 std::cin>>N;
 v.resize(N);
 w.resize(N);
 for(int i=0;i<N;i++){
  std::cin>>v[i]>>w[i];
 }
 int Q;
 std::cin>>Q;

 lgN=std::min(512,N);
 //lgN=N;
 dp.resize(lgN+1);
 for(int i=0;i<lgN+1;i++){
  dp[i].resize(100001);
 }
 for(int i=0;i<lgN+1;i++){
  dp[0][i]=0;
  dp[i][0]=0;
 }

 for(int i=1;i<lgN+1;i++){
  for(int j=1;j<100001;j++){
   if(j>=w[i-1] && dp[i/2][j]<dp[i/2][j-w[i-1]]+v[i-1]){
    dp[i][j]=dp[i/2][j-w[i-1]]+v[i-1];
   }else{
    dp[i][j]=dp[i/2][j];
   }
  }
 }

 //std::cout<<std::endl;

 int ver,L;
 for(int i=0;i<Q;i++){
  std::cin>>ver>>L;
  std::cout<<knapsack(ver,L)<<std::endl;
 }

 return 0;
}