#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
// https://www.geeksforgeeks.org/how-to-check-if-a-given-point-lies-inside-a-polygon/
struct Point {
double x, y;
};
// Checking if a point is inside a polygon
bool point_in_polygon(Point point, vector<Point> polygon)
{
int num_vertices = polygon.size();
double x = point.x, y = point.y;
bool inside = false;
// Store the first point in the polygon and initialize
// the second point
Point p1 = polygon[0], p2;
// Loop through each edge in the polygon
for (int i = 1; i <= num_vertices; i++) {
// Get the next point in the polygon
p2 = polygon[i % num_vertices];
// Check if the point is above the minimum y
// coordinate of the edge
if (y >= min(p1.y, p2.y)) {
// Check if the point is below the maximum y
// coordinate of the edge
if (y <= max(p1.y, p2.y)) {
// Check if the point is to the left of the
// maximum x coordinate of the edge
if (x <= max(p1.x, p2.x)) {
// Calculate the x-intersection of the
// line connecting the point to the edge
double x_intersection
= (y - p1.y) * (p2.x - p1.x)
/ (p2.y - p1.y)
+ p1.x;
// Check if the point is on the same
// line as the edge or to the left of
// the x-intersection
if (p1.x == p2.x
|| x <= x_intersection) {
// Flip the inside flag
inside = !inside;
}
}
}
}
// Store the current point as the first point for
// the next iteration
p1 = p2;
}
// Return the value of the inside flag
return inside;
}
void solve() {
int n; cin >> n;
vector<Point> points(n);
for (int i = 0; i < n; i++) {
int x, y; cin >> x >> y;
points[i].x = x;
points[i].y = y;
}
auto Nobita = Point();
cin >> Nobita.x >> Nobita.y;
cout << (point_in_polygon(Nobita, points) ? "YES" : "NO") << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt = 1;
// cin >> tt;
for(int t = 1; t <= tt; t++) {
solve();
}
}