CSES - Shared codeLink to this code: https://cses.fi/paste/8b6c054cbc8b6ef330303e/
//PPAP_1264589
#include "bits/stdc++.h"
#define Task "A"
#define up(i,a,b) for (int i = a; i <= b; i++)
#define pii pair<long long, long long>
#define x first
#define y second
using namespace std;
const int LIM = 1010580540;
const int MOD = 1e9 + 7;
const int maxn = 1e5 + 10;
int n,m;
pii P[maxn];
pii K;
int sign(long long k){
if (k < 0) return -1;
if (k > 0) return 1;
return 0;
}
pii vect(pii p, pii q){
return make_pair(q.x - p.x, q.y - p.y);
}
long long dot(pii u, pii v){
long long DOT = u.x*v.x + u.y*v.y;
return sign(DOT);
}
long long cross(pii u, pii v){
long long ccw = u.x*v.y - u.y*v.x;
return sign(ccw);
}
int intersect(pii A, pii C, pii D){
int ACD = cross(vect(A, C), vect(C, D));
int CDA = cross(vect(C, D), vect(D, A));
if (CDA == 0 && dot(vect(A, D), vect(A, C)) <= 0) return 1;
if (C.y <= A.y && D.y > A.y && ACD < 0) return 2;
if (C.y > A.y && D.y <= A.y && ACD > 0) return 2;
return 0;
}
string Point_in_Polygon(){
int cnt = 0;
bool boundary = 0;
up(i,1,n){
pii cur = P[i];
pii next = P[i+1];
if (intersect(K, cur, next) == 1){
boundary = 1;
break;
}
if (intersect(K, cur, next) == 2) ++cnt;
}
if (boundary) return "BOUNDARY";
else if (cnt & 1) return "INSIDE";
return "OUTSIDE";
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
if (fopen(Task".inp", "r")){
freopen (Task".inp", "r", stdin);
freopen (Task".out", "w", stdout);
}
cin >> n >> m;
up(i,1,n) cin >> P[i].x >> P[i].y;
P[n+1] = P[1];
up(i,1,m){
cin >> K.x >> K.y;
cout << Point_in_Polygon() << "\n";
}
}
// Algorithmic logic