#include<stdio.h>
int R=1,C=1,H[2000010],N[2000010],f[2000010];
int MAX(int a,int b){return a>b?a:b;}
//評価関数（いまはMIN）
int hyouka(int a,int b){
  if(C<b)return 1;
  if(C<a||b==0)return 0;
  return N[H[a]]<N[H[b]]?1:0;
}
//挿入関数
void hin(int a){
  int i=C++;
  for(N[H[0]=R]=a;hyouka(0,i/2);i/=2)H[i]=H[i/2];
  H[i]=R++;
}
//取り出す関数
int hout(){
  int rt=H[1],i,j=2,k=H[--C];
  for(i=1;hyouka(i,C);i=j)H[i]=H[j=i*2+1-hyouka(i*2,i*2+1)];
  H[j/2]=k;
  return rt;
}
int ub(int l,int r,int n,int *d){
  int m=(l+r)/2;
  if(l==r)return m;
  return n<d[m]?ub(l,m,n,d):ub(m+1,r,n,d);
}
int lb(int l,int r,int n,int *d){
  int m=(l+r)/2;
  if(l==r)return m;
  return n<=d[m]?lb(l,m,n,d):lb(m+1,r,n,d);
}
int n,a[100010],b[100010],c[100010],d[100010],v[500010],w[500050],ans[100010];
void g(int x,int y){//printf("%d\n",x);
  int p=(1<<y),i,j,l,r;
  if(x>n)return ;
  //printf("p%d\n",p);
  for(i=0;i<p;i++){
    v[i+p]=v[i]+a[x-1];
    w[i+p]=w[i]+b[x-1];
  }
  l=lb(0,n,x,c);
  r=ub(0,n,x,c);//printf("%d %d %d\n",l,r,2*p);
  for(i=l;i<r;i++){
    for(j=0;j<2*p;j++){//printf("vd:%d %d\n",v[j],w[j]);
      if(w[j]<=d[i])ans[i]=MAX(ans[i],v[j]);
    }
  }//printf("aaaa\n");
  g(x*2  ,y+1);
  g(x*2+1,y+1);
}
int main(){
  int i,e,m;
  scanf("%d",&n);
  for(i=0;i<n;i++)scanf("%d %d",&a[i],&b[i]);
  scanf("%d",&m);
  for(i=0;i<m;i++){
    scanf("%d %d",&e,&f[R]);
    hin(e);
  }
  for(i=0;i<m;i++){
    e=hout();
    c[i]=N[e];
    d[i]=f[e];
  }
  //for(i=0;i<m;i++)printf("%d %d\n",c[i],d[i]);
  //printf("aa\n");
  v[0]=w[0]=0;
  g(1,0);
  for(i=0;i<m;i++)printf("%d\n",ans[i]);
  return 0;
}
		    
