For a given polygon g and target points t, print "2" if g contains t, "1" if t is on a segment of g, "0" otherwise.

g is represented by a sequence of points p1, p2,..., pn where line segments connecting pi and pi+1 (1 ≤ i ≤ n-1) are sides of the polygon. The line segment connecting pn and p1 is also a side of the polygon.

Note that the polygon is not necessarily convex.

Constraints

* 3 ≤ n ≤ 100
* 1 ≤ q ≤ 1000
* -10000 ≤ xi, yi ≤ 10000
* No point of the polygon will occur more than once.
* Two sides of the polygon can intersect only at a common endpoint.

Input

The entire input looks like:


g (the sequence of the points of the polygon)
q (the number of queris = the number of target points)
1st query
2nd query
:
qth query


g is given by coordinates of the points p1,..., pn in the following format:


n
x1 y1
x2 y2
:
xn yn


The first integer n is the number of points. The coordinate of a point pi is given by two integers xi and yi. The coordinates of points are given in the order of counter-clockwise visit of them.

Each query consists of the coordinate of a target point t. The coordinate is given by two intgers x and y.

Output

For each query, print "2", "1" or "0".

Example

Input

4
0 0
3 1
2 3
0 3
3
2 1
0 2
3 2


Output

2
1
0
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
#define EPS (1e-10)
#define equals(a, b) (fabs(a-b)<EPS)
static const int CCW=1;//?????¶???
static const int CW=-1;//?????¶???
static const int BACK=-2;//?????¢
static const int FRONT=2;//?????¢
static const int ON=0;//?????????

struct Point//???
{
    double x, y;
    Point(double x=0, double y=0):x(x), y(y){}
};
typedef Point Vector;//??????

struct Segment{ Point p1, p2; };//??????
typedef Segment Line;//??´???

class Circle//???
{
public:
    Point c;
    double r;
    Circle(Point c=Point(), double r=0.0):c(c), r(r){}
};

typedef vector<Point> Polygon;//????????¢

Point operator + (Point a, Point b){ return Point(a.x+b.x, a.y+b.y); }
Point operator - (Point a, Point b){ return Point(a.x-b.x, a.y-b.y); }
Point operator * (Point a, double p){ return  Point(a.x*p, a.y*p); }
Point operator / (Point a, double p){ return Point(a.x/p, a.y/p); }

double norm(Vector a){ return a.x*a.x+a.y*a.y; }//?????°????¨?????????????
double abs(Vector a){ return sqrt(norm(a)); }//?¨?
double dot(Vector a, Vector b){ return a.x*b.x+a.y*b.y; }//??????
double cross(Vector a, Vector b){ return a.x*b.y-a.y*b.x; }//??????

bool isOrthgonal(Vector a, Vector b){ return equals(dot(a, b), 0.0); }//???????????´????????????
bool isOrthgonal(Point a1, Point a2, Point b1, Point b2){ return isOrthgonal(a1-a2, b1-b2); }//???????????´???4?????????
bool isOrthgonal(Segment s1, Segment s2){ return equals(dot(s1.p2-s1.p1, s2.p2-s2.p1), 0.0); }//???????????´????????????

bool isParallel(Vector a, Vector b){ return equals(cross(a, b), 0.0); }//????????????????????????
bool isParallel(Point a1, Point a2, Point b1, Point b2){ return isParallel(a1-a2, b1-b2); }//???????????????4?????????
bool isParallel(Segment s1, Segment s2){ return equals(cross(s1.p2-s1.p1, s2.p2-s2.p1), 0.0); }//????????????????????????

Point project(Segment s, Point p)//?±?????¶?
{
    Vector base=s.p2-s.p1;
    double r=dot(p-s.p1, base)/norm(base);
    return s.p1+base*r;
}

Point reflect(Segment s, Point p)//?±??????°??´??????????§°???
{
    return p+(project(s, p)-p)*2.0;
}

int ccw(Point p0, Point p1, Point p2)//??????P0,P1,P2??????????????????
{
    Vector a=p1-p0;
    Vector b=p2-p0;
    if( cross(a, b)>EPS ) return CCW;
    if( cross(a, b)<-EPS ) return CW;
    if( dot(a, b)<-EPS ) return BACK;
    if( norm(a)<norm(b) ) return FRONT;
    return ON;
}

bool intersect(Point p1, Point p2, Point p3, Point p4){ return (ccw(p1, p2, p3)*ccw(p1, p2, p4)<=0 &&ccw(p3, p4, p1)*ccw(p3, p4, p2)<=0); }//???????????????4?????????
bool intersect(Segment s1, Segment s2){ return intersect(s1.p1, s1.p2, s2.p1, s2.p2); }//???????????????????????????

double getDistance(Point a, Point b){ return abs(a-b); }//????????´?????????
double getDistanceLP(Line l, Point p){ return abs(cross(l.p2-l.p1, p-l.p1)/abs(l.p2-l.p1)); }//?????°??´????????????
double getDistanceSP(Segment s, Point p)//?????°???????????????
{
    if(dot(s.p2-s.p1, p-s.p1)<0.0) return abs(p-s.p1);
    if(dot(s.p1-s.p2, p-s.p2)<0.0) return abs(p-s.p2);
    return getDistanceLP(s, p);
}
double getDistanceSS(Segment s1, Segment s2)//???????????´?????????
{
    if(intersect(s1, s2)) return 0.0;
    return min( min(getDistanceSP(s1,s2.p1), getDistanceSP(s1,s2.p2)),
                min(getDistanceSP(s2,s1.p1), getDistanceSP(s2,s1.p2)) );
}

Point getCrossPoint(Segment s1, Segment s2)//??????????????????
{
    Vector base=s2.p2-s2.p1;
    double d1=abs(cross(base, s1.p1-s2.p1));
    double d2=abs(cross(base, s1.p2-s2.p1));
    double t=d1/(d1+d2);
    return s1.p1+(s1.p2-s1.p1)*t;
}
/*
???????????¨????????¢?????¨
IN 2
ON 1
OUT 0
*/
int contains(Polygon g, Point p)
{
    int n=g.size();
    bool x=false;
    for(int i=0; i<n; i++)
    {
        Point a=g[i]-p;
        Point b=g[(i+1)%n]-p;
        if(abs(cross(a, b))<EPS && dot(a, b)<EPS) return 1;
        if(a.y>b.y) swap(a,b);
        if(a.y<EPS && EPS<b.y && cross(a,b)>EPS) x=!x;
    }
    return (x? 2 : 0);
}

int main()
{
    int n, q;
    vector<Point> g;
    scanf("%d", &n);
    while(n--)
    {
        Point p;
        scanf("%lf%lf", &p.x, &p.y);
        g.push_back(p);
    }
    scanf("%d", &q);
    while(q--)
    {
        Point p;
        scanf("%lf%lf", &p.x, &p.y);
        printf("%d\n", contains(g, p));
    }
    return 0;
}