#include<stdio.h>
#include<stdlib.h>
#define MAXN 20
#define MAXM 531441
typedef struct {
	int x,y,z;
} st;
st x[MAXM+10],y[MAXM+10];
int a[MAXN+10],b[MAXN+10];
void dfs(int now, int ub, st *x, int &num){
	if (now<=ub){
		int temp=num;
		for (int i=1;i<=temp;i++){
			x[++num]=(st){x[i].x+a[now],x[i].y+b[now],x[i].z+1};
			x[++num]=(st){x[i].x+b[now],x[i].y+a[now],x[i].z+1};
		}
		dfs(now+1,ub,x,num);
	}
}
int comp2(const void *a, const void *b){
	return ((st*)a)->x-((st*)b)->x;
}
int comp3(const void *a, const void *b){
	return ((st*)b)->x-((st*)a)->x;
}
int min(int a, int b){
	return a<b?a:b;
}
int main(void){
	int n;
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%d%d",a+i,b+i);
	}
	int numx=1,numy=1;
	x[1]=y[1]=(st){0,0,0};
	dfs(1,n/2,x,numx);
	dfs(n/2+1,n,y,numy);
	qsort(x+1,numx,sizeof(st),comp2);//x small to big
	qsort(y+1,numy,sizeof(st),comp3);//x big to small
	int q;
	scanf("%d",&q);
	while (q--){
		int high=1,qx,qy;
		scanf("%d%d",&qx,&qy);
		int maxz=n/2+2;
		int maxy[MAXN+10];
		for (int i=0;i<=maxz;i++){
			maxy[i]=-1;
		}
		int ans=n+10;
		for (int i=1;i<=numx;i++){
			while (high<=numy&&y[high].x+x[i].x>=qx){
				if (maxy[y[high].z]<y[high].y){
					maxy[y[high].z]=y[high].y;
				}
				high++;
			}
			for (int j=0;j<=maxz;j++){
				if (maxy[j]!=-1&&maxy[j]+x[i].y>=qy){
					ans=min(ans,j+x[i].z);
					break;
				}
			}
		}
		if (ans!=n+10) printf("%d\n",ans);
		else printf("-1\n");
	}
}