#include <bits/stdc++.h>
using namespace std;
struct point {
  long long x, y;
  point(long long _x = 0, long long _y = 0) {
    x = _x;
    y = _y;
  }
};
long long OS(point f, point s, point t) {
  return (f.x - s.x) * (f.y + s.y) + (s.x - t.x) * (s.y + t.y) +
         (t.x - f.x) * (t.y + f.y);
}
int n;
deque<point> IN;
bool is_in(point w) {
  for (int i = 0; i < n; ++i)
    if (OS(IN[i], IN[(i + 1) % n], w) < 0) return false;
  return true;
}
void solve() {
  point W;
  int i, j, k, l;
  scanf("%d%d", &k, &l);
  W = point(k, l);
  if (!is_in(W)) {
    printf("0\n");
    return;
  }
  long long ANS = (n * (n - 1LL) * (n - 2LL)) / 6;
  for (int step = 0; step < n; ++step) {
    int LE = 1, RE = n - 1, M;
    while (1) {
      if (RE - LE < 2) {
        if (OS(IN[0], IN[RE], W) > 0)
          M = RE;
        else
          M = LE;
        break;
      }
      int M = (LE + RE) / 2;
      if (OS(IN[0], IN[M], W) > 0)
        LE = M;
      else
        RE = M;
    }
    long long how = n - 1 - M;
    ANS -= (how * (how - 1)) / 2;
    IN.push_back(IN[0]);
    IN.pop_front();
  }
  cout << ANS << '\n';
}
int main() {
  int i, j, x, y;
  scanf("%d", &n);
  for (i = 0; i < n; ++i) {
    scanf("%d%d", &x, &y);
    IN.push_back(point(x, y));
  }
  i = 0;
  j = n - 1;
  while (i < j) {
    swap(IN[i], IN[j]);
    ++i;
    --j;
  }
  scanf("%d", &x);
  while (x-- > 0) solve();
  return 0;
}
