#include <bits/stdc++.h>
using namespace std;
struct pt {
  long long x, y;
  pt() {}
  pt(long long _x, long long _y) : x(_x), y(_y) {}
  pt operator+(const pt& p) const { return pt(x + p.x, y + p.y); }
  pt operator-(const pt& p) const { return pt(x - p.x, y - p.y); }
  long long cross(const pt& p) const { return x * p.y - y * p.x; }
  long long dot(const pt& p) const { return x * p.x + y * p.y; }
  long long cross(const pt& a, const pt& b) const {
    return (a - *this).cross(b - *this);
  }
  long long dot(const pt& a, const pt& b) const {
    return (a - *this).dot(b - *this);
  }
  long long sqrLen() const { return this->dot(*this); }
};
bool lexComp(const pt& l, const pt& r) {
  return l.x < r.x || (l.x == r.x && l.y < r.y);
}
int sgn(long long val) { return val > 0 ? 1 : (val == 0 ? 0 : -1); }
vector<pt> seq;
int n;
bool pointInTriangle(pt a, pt b, pt c, pt point) {
  long long s1 = abs(a.cross(b, c));
  long long s2 =
      abs(point.cross(a, b)) + abs(point.cross(b, c)) + abs(point.cross(c, a));
  if (abs(point.cross(a, b)) == 0) return 0;
  return s1 == s2;
}
void prepare(vector<pt>& points) {
  n = points.size();
  int pos = 0;
  for (int i = 1; i < n; i++) {
    if (lexComp(points[i], points[pos])) pos = i;
  }
  rotate(points.begin(), points.begin() + pos, points.end());
  n--;
  seq.resize(n);
  for (int i = 0; i < n; i++) seq[i] = points[i + 1] - points[0];
}
bool pointInConvexPolygon(pt point) {
  if (seq[0].cross(point) != 0 &&
      sgn(seq[0].cross(point)) != sgn(seq[0].cross(seq[n - 1])))
    return false;
  if (seq[n - 1].cross(point) != 0 &&
      sgn(seq[n - 1].cross(point)) != sgn(seq[n - 1].cross(seq[0])))
    return false;
  if (seq[0].cross(point) == 0) return false;
  if (seq[n - 1].cross(point) == 0) return false;
  int l = 0, r = n - 1;
  while (r - l > 1) {
    int mid = (l + r) / 2;
    int pos = mid;
    if (seq[pos].cross(point) >= 0)
      l = mid;
    else
      r = mid;
  }
  int pos = l;
  return pointInTriangle(seq[pos], seq[pos + 1], pt(0, 0), point);
}
int main() {
  long long(n);
  scanf("%lld", &(n));
  ;
  vector<pt> A(n);
  set<pair<long long, long long> > seta;
  for (long long i = 0; i < (n); i++) {
    long long(a), (b);
    scanf("%lld%lld", &(a), &(b));
    ;
    A[i] = pt(a, b);
    seta.insert({a, b});
  }
  reverse((A).begin(), (A).end());
  bool f = 0;
  long long(m);
  scanf("%lld", &(m));
  ;
  vector<pt> B(m);
  for (long long i = 0; i < (m); i++) {
    long long(a), (b);
    scanf("%lld%lld", &(a), &(b));
    ;
    B[i] = pt(a, b);
    if (seta.count({a, b})) f = 1;
  }
  if (f) {
    printf("NO\n");
    return 0;
  }
  prepare(A);
  for (long long i = 0; i < (m); i++) {
    if (!pointInConvexPolygon(B[i] - A[0])) {
      printf("NO\n");
      return 0;
    }
  }
  printf("YES\n");
  return 0;
}
