/* Problem URL: https://codeforces.com/gym/102361/problem/A */ #include #include #include using namespace std; using namespace __gnu_pbds; template > using ordered_set = tree; #define V vector #define rmin(a, b) a = min(a, b) #define rmax(a, b) a = max(a, b) #define rep(i, lim) for (int i = 0; i < (lim); i++) #define nrep(i, s, lim) for (int i = s; i < (lim); i++) #define repv(i, v) for (auto &i : (v)) #define fillv(v) for (auto &itr_ : (v)) { cin >> itr_; } #define sortv(v) sort(v.begin(), v.end()) #define all(v) (v).begin(), (v).end() using vi = vector; using vvi = vector; using vvvi = vector; using vvvvi = vector; using ll = long long; using vl = vector; using vvl = vector; using vvvl = vector; using vvvvl = vector; template auto operator<<(ostream &os, const vector &vec)->ostream& { os << vec[0]; for (size_t i = 1; i < vec.size(); i++) { os << ' ' << vec[i]; } os << '\n'; return os; } template auto operator>>(istream &is, vector &vec)->istream& { for (auto &i : vec) { is >> i; } return is; } template auto operator<<(ostream &os, const vector> &vec)->ostream& { for (auto &i : vec) { os << i[0]; for (size_t j = 1; j < i.size(); j++) { os << ' ' << i[j]; } os << '\n'; } return os; } template auto operator>>(istream &is, vector> &vec)->istream& { for (auto &i : vec) { for (auto &j : i) { is >> j; } } return is; } const int oo = INT32_MAX >> 1; const ll OO = INT64_MAX >> 1; struct pt { ll x, y; int c; pt() = default; pt(ll x, ll y): x(x), y(y) {} pt(pt a, int c): x(a.x), y(a.y), c(c) {} friend istream &operator >> (istream &is, pt &a) { is >> a.x >> a.y; return is; } pt operator - (pt b) { return pt(x - b.x, y - b.y); } ll operator * (pt b) { return x * b.x + y * b.y; } ll operator ^ (pt b) { return x * b.y - y * b.x; } }; int ccw(pt a, pt b, pt c) { ll r = (b - a) ^ (c - b); return (r > 0) - (r < 0); } ll cdot(pt a, pt b, pt c) { return (b - a) * (c - a); } int quad(pt a) { static int q[][2] = {{0, 1}, {3, 2}}; return q[a.x < 0][a.y < 0]; } bool polar_cmp(pt a, pt b) { if (quad(a) != quad(b)) { return quad(a) < quad(b); } return ccw(pt(0, 0), a, b) < 0; } void pre() { } #define TEST 0 void solve() { int n, q; cin >> n >> q; V pts(n + q); cin >> pts; vl ans(q); vi inv(n); vi va(q); vi ev(n + q); iota(all(inv), 0); iota(all(va), n); iota(all(ev), 0); rep(i, n) { auto cmp = [&](int j, int k) { if (j == i) { return false; } if (k == i) { return true; } return polar_cmp(pts[j] - pts[i], pts[k] - pts[i]); }; sort(all(va), cmp); sort(all(inv), cmp); int sz = inv.size() - 1; V> tmp; int c = 1; nrep(j, 1, sz) { if (ccw(pts[i], pts[inv[j - 1]], pts[inv[j]]) == 0) { c++; continue; } tmp.emplace_back(inv[j - 1], c); c = 1; } tmp.emplace_back(inv.end()[-2], c); int j = 0; int k = 0; auto valid1 = [&]() { auto p1 = pts[va[j]]; if (ccw(pts[i], p1, pts[inv[0]]) > 0 && ccw(pts[i], p1, pts[inv.end()[-2]]) > 0) { return false; } if (ccw(pts[i], p1, pts[inv[0]]) < 0 && ccw(pts[i], p1, pts[inv.end()[-2]]) < 0 && cdot(pts[i], p1, pts[inv[0]]) > 0 && cdot(pts[i], p1, pts[inv.end()[-2]]) > 0) { return false; } return true; }; while (j < va.size()) { auto p1 = pts[va[j]]; auto p2 = pts[tmp[k % tmp.size()].first]; if (!valid1()) { j++; continue; } if (ccw(pts[i], p1, p2) > 0) { k++; continue; } ll dot = cdot(pts[i], p1, p2); if (dot < 0) { j++; continue; } if (dot > 0) { auto p3 = pts[tmp[(k + 1) % tmp.size()].first]; if (ccw(pts[i], p1, p3) > 0 || cdot(pts[i], p1, p3) < 0) { j++; continue; } k++; continue; } ans[va[j] - n] += tmp[k % tmp.size()].second; j++; } auto valid2 = [&]() { auto p1 = pts[va[j]]; if (ccw(pts[i], p1, pts[inv[0]]) < 0 && ccw(pts[i], p1, pts[inv.end()[-2]]) < 0) { return false; } if (ccw(pts[i], p1, pts[inv[0]]) > 0 && ccw(pts[i], p1, pts[inv.end()[-2]]) > 0 && cdot(pts[i], p1, pts[inv[0]]) > 0 && cdot(pts[i], p1, pts[inv.end()[-2]]) > 0) { return false; } return true; }; j = va.size() - 1; k = tmp.size() - 1; auto kpos = [&]() { return (k % tmp.size() + tmp.size()) % tmp.size(); }; while (j >= 0) { auto p1 = pts[va[j]]; auto p2 = pts[tmp[kpos()].first]; if (!valid2()) { j--; continue; } if (ccw(pts[i], p1, p2) < 0) { k--; continue; } ll dot = cdot(pts[i], p1, p2); if (dot < 0) { j--; continue; } if (dot > 0) { auto p3 = pts[tmp[((k - 1) % tmp.size() + tmp.size()) % tmp.size()].first]; if (ccw(pts[i], p1, p3) > 0 || cdot(pts[i], p1, p3) < 0) { j--; continue; } k--; continue; } ans[va[j] - n] += tmp[kpos()].second; j--; } } nrep(i, n, n + q) { auto cmp = [&](int j, int k) { return polar_cmp(pts[j] - pts[i], pts[k] - pts[i]); }; sort(all(inv), cmp); V> tmp; int c = 1; nrep(j, 1, n) { if (ccw(pts[i], pts[inv[j - 1]], pts[inv[j]]) == 0) { c++; continue; } tmp.emplace_back(inv[j - 1], c); c = 1; } tmp.emplace_back(inv.end()[-1], c); int j = 0; int k = 0; while (j < tmp.size()) { while (k <= j) { k++; } auto p1 = pts[tmp[j].first]; auto p2 = pts[tmp[k % tmp.size()].first]; ll dot = (p1 - pts[i]) * (p2 - pts[i]); if (ccw(pts[i], p1, p2) >= 0 || dot < 0) { j++; continue; } if (dot > 0) { k++; continue; } ans[i - n] += tmp[j].second * tmp[k % tmp.size()].second; j++; } } repv(i, ans) { cout << i << '\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); pre(); int t; (TEST && cin >> t) || (t = 1); while (t--) { solve(); } }