Link 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