#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define X first
#define Y second.first
#define C second.second
using namespace std;
typedef pair<int,pair<int,int> > piii;
int n,q,ans,A[25],B[25];
int LIM;
vector<piii> rect1,rect2;
int lst[100010],tree[100010];
int find(int x)
{
    int head = 1,tail = rect2.size(),mid;
    while(head != tail)
    {
        mid = (head+tail+1)>>1;
        if(lst[mid] <= x) head = mid;
        else tail = mid-1;
    }
    return lst[head]<=x?head:0;
}
void add(int pos,int v)
{
    for(;pos<=rect2.size();pos+=pos&(-pos)) tree[pos] = min(tree[pos],v);
}
int query(int pos)
{
    int ret = tree[0];
    for(;pos;pos-=pos&(-pos)) ret = min(ret,tree[pos]);
    return ret;
}
void dfs(int dep,int xSum,int ySum,int num,vector<piii> &rect)
{
    if(dep>LIM) rect.push_back(make_pair(xSum,make_pair(ySum,num)));
    else
    {
        dfs(dep+1,xSum,ySum,num,rect);
        dfs(dep+1,xSum+A[dep],ySum+B[dep],num+1,rect);
        dfs(dep+1,xSum+B[dep],ySum+A[dep],num+1,rect);
    }
}
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%d%d",&A[i],&B[i]);
    
    LIM = n/2; dfs(1,0,0,0,rect1);
    LIM = n; dfs(n/2+1,0,0,0,rect2);
    for(i=0;i<rect2.size();i++) lst[i+1] = -rect2[i].Y;
    sort(lst+1,lst+1+rect2.size());
    sort(rect1.begin(),rect1.end()); sort(rect2.begin(),rect2.end());
    
    scanf("%d",&q);
    while(q--)
    {
        memset(tree,60,sizeof(tree)); ans = tree[0];
        scanf("%d%d",&A[0],&B[0]);
        
        for(i=0,j=rect2.size()-1;i<rect1.size();i++)
        {
            while(j>=0 && rect1[i].X+rect2[j].X>=A[0])
            {
                add(find(-rect2[j].Y),rect2[j].C);
                j--;
            }
            ans = min(ans,rect1[i].C+query(find(-B[0]+rect1[i].Y)));
        }
        printf("%d\n",ans<=n?ans:-1);
    }
    return 0;
}