#include"bits/stdc++.h"

using namespace std;

#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(i,m,n) for(int i=(m);i<(n);i++)

const double EPS = 1e-8;
typedef complex<double> point;
point operator*(const point&p, const double &d) {
	return point(real(p)*d, imag(p)*d);
}
namespace std {
	bool operator < (const point& a, const point& b) {
		return real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b);
	}
	
	//istream &operator>>(istream &stream, point &p) {
	//	stream >> p.real >> p.imag;
	//	return stream;
	//}
}
//直線or線分
struct Line : public vector<point> {
	Line(const point &a, const point &b) {
		push_back(a); push_back(b);
	}
};
//外積
double cross(const point& a, const point& b) {
	return imag(conj(a)*b);
}
//内積
double dot(const point& a, const point& b) {
	return real(conj(a)*b);
}
int ccw(point a, point b, point c) {
	b -= a; c -= a;
	if (cross(b, c) > 0)   return +1;       // counter clockwise
	if (cross(b, c) < 0)   return -1;       // clockwise
	if (dot(b, c) < 0)     return +2;       // c--a--b on line
	if (norm(b) < norm(c)) return -2;       // a--b--c on line
	return 0;
}
//交差判定
bool intersectLL(const Line &l1, const Line &l2) {
	return abs(cross(l1[1] - l1[0], l2[1] - l2[0])) > EPS || //non-parallel
		abs(cross(l1[1] - l1[0], l2[0] - l1[0])) < EPS; //same line
}
bool intersectLS(const Line &l, const Line &s) {
	return cross(l[1] - l[0], s[0] - l[0])* // s[0] is left of l
		cross(l[1] - l[0], s[1] - l[0]) < EPS; // s[1] is right of l
}
bool intersectLP(const Line &l, const point &p) {
	return abs(cross(l[1] - p, l[0] - p)) < EPS;
}
bool intersectSS(const Line &s, const Line &t) {
	return ccw(s[0], s[1], t[0])*ccw(s[0], s[1], t[1]) <= 0 &&
		ccw(t[0], t[1], s[0])*ccw(t[0], t[1], s[1]) <= 0;
}

bool intersectSP(const Line &s, const point &p) { //verified on 2020/04/03 https://onlinejudge.u-aizu.ac.jp/status/users/Mojumbo/submissions/1/1157/judge/4316978/C++14
	return abs(s[0] - p) + abs(s[1] - p) - abs(s[1] - s[0]) < EPS; //triangle inequality
}
//距離,交点
//射影 直線lにpから下した垂線との交点

point projection(const Line &l, const point &p) { //verified on 2020/04/03 https://onlinejudge.u-aizu.ac.jp/status/users/Mojumbo/submissions/1/1157/judge/4316978/C++14
	double t = dot(p - l[0], l[0] - l[1]) / norm(l[0] - l[1]);
	return l[0] + (l[0] - l[1])*t;
}
//射影 直線lを対象軸としてpと線対称にある点
point reflection(const Line &l, const point &p) {
	return p + (projection(l, p) - p)*2;
}
double distancePP(const point& a, const point& b) {
	return sqrt(norm(a - b));
}
double distanceLP(const Line &l, const point &p) {
	return abs(p - projection(l, p));
}
double distanceLL(const Line&l, const Line &m) {
	return intersectLL(l, m) ? 0 : distanceLP(l, m[0]);
}
double distanceLS(const Line &l, const Line &s) {
	if (intersectLS(l, s))return 0;
	return min(distanceLP(l, s[0]), distanceLP(l, s[1]));
}
double distanceSP(const Line &s, const point &p) {
	const point r = projection(s, p);
	if (intersectSP(s, r))return abs(r - p);
	return min(abs(s[0] - p), abs(s[1] - p));
}
double distanceSS(const Line &s, const Line &t) { //verified on 2020/04/03 https://onlinejudge.u-aizu.ac.jp/status/users/Mojumbo/submissions/1/1157/judge/4316978/C++14
	if (intersectSS(s, t))return 0;
	return min({ distanceSP(s,t[0]),distanceSP(s,t[1]),distanceSP(t,s[0]),distanceSP(t,s[1]) });
}
point crosspoint(const Line &l, const Line &m) {
	double A = cross(l[1] - l[0], m[1] - m[0]);
	double B = cross(l[1] - l[0], l[1] - m[0]);
	if (abs(A) < EPS&&abs(B) < EPS)return m[0];//same line
	if (abs(A) < EPS)assert(false); // Precondition not satisfied
	return m[0] + B / A * (m[1] - m[0]);
}
double dist(point &p1, point &p2) {
	return abs(p1 - p2);
}

//円
struct Circle {
	point p; double r;
	Circle(const point &p, double r) : p(p), r(r) { }
};

//凸包
vector<point> convex_hull(vector<point> ps) {
	int n = ps.size(), k = 0;
	sort(ps.begin(), ps.end());
	vector<point> ch(2 * n);
	for (int i = 0; i < n; ch[k++] = ps[i++]) // lower-hull
		while (k >= 2 && ccw(ch[k - 2], ch[k - 1], ps[i]) <= 0) --k;
	for (int i = n - 2, t = k + 1; i >= 0; ch[k++] = ps[i--]) // upper-hull
		while (k >= t && ccw(ch[k - 2], ch[k - 1], ps[i]) <= 0) --k;
	ch.resize(k - 1);
	return ch;
}

//2点を通る半径Rの円の中心
pair<point, point> get_circle_from_2points(point &p1, point &p2, double R) {
	double d = dist(p1, p2);
	double x1 = p1.real(), x2 = p2.real();
	double y1 = p1.imag(), y2 = p2.imag();
	if (p1.imag() == p2.imag()) {
		double x = (x1 + x2) / 2.0;
		double dy = sqrt(R - d * d / 4);
		return { { x,y1 + dy },{ x,y1 - dy } };
	}
	else {
		double m = (x1 - x2) / (y2 - y1);
		double t = sqrt(R*R - d * d / 4);
		double dx = sqrt((t*t) / (m*m + 1));
		double dy = sqrt(t*t - dx * dx);
		double gx = (x1 + x2) / 2;
		double gy = (y1 + y2) / 2;
		if (m > EPS) {
			return { { gx + dx,gy + dy },{ gx - dx,gy - dy } };
		}
		else {
			return { { gx + dx,gy - dy },{ gx - dx,gy + dy } };
		}
	}
}
//長方形
struct Square {
	double lx, ly, rx, ry;
	Square(double lx_, double ly_, double rx_, double ry_, double h_) :lx(lx_), ly(ly_), rx(rx_), ry(ry_){};
	bool include(point &p) {
		return p.real()+EPS >= lx && p.real()-EPS <= rx && p.imag()+EPS >= ly && p.imag()-EPS <= ry;
	}
};
// TODO: コンストラクタにvector<point>を渡して初期化したい
struct Polygon : public vector<point>{
	//0->OUT, 1->ON, 2->IN
	int contains(const point &p) {
		bool in = false;
		int N = this->size();
		for (int i = 0; i < N; i++){
			point a = this->at(i) - p;
			point b = this->at((i + 1) % N) - p;
			if (imag(a) > imag(b)) {
				std::swap(a,b);
			}
			if (imag(a) <= 0 && 0 < imag(b))
				if (cross(a, b) < 0)in = !in;
			if (cross(a, b) == 0 && dot(a, b) <= 0)return 1;
		}
		return in ? 2 : 0;
	}
};

void solve() {
	int N; cin >> N;
	Polygon poly;
	REP(i, N) {
		double x, y; cin >> x >> y;
		point p(x, y);
		poly.push_back(p);
	}
	int q; cin >> q;
	while (q--) {
		double x, y; cin >> x >> y;
		point p(x, y);
		cout << poly.contains(p) << endl;
	}
}
signed main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

	solve();
}


Measured memory_bytes: 3332