#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <utility>
#define maxn 105
#define EPS 1e-10
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
struct Point{
	double x,y;
	Point(double x = 0.0,double y = 0.0): x(x),y(y) {}
	Point operator + (Point p){
		return Point(x + p.x,y + p.y);
	}
	Point operator - (Point p){
		return Point(x - p.x,y - p.y);
	}
	Point operator * (double lambda){
		return Point(x * lambda,y * lambda);
	}
	Point operator / (double lambda){
		return Point(x / lambda,y / lambda);
	}
	Point operator - (){
		return Point(-x,-y);
	}
	double norm(){
		return x * x + y * y;
	}
	double abs_(){
		return sqrt(norm());
	}
	bool operator == (const Point &p)const
	{
		return abs(x - p.x) < EPS && abs(y - p.y) < EPS;
	}
	bool operator < (const Point &p)const
	{
		if(abs(x - p.x) < EPS) return y < p.y;
		else return x < p.x;
	}
};
typedef Point Vector;
struct Segment{
	Point p1,p2;
	Segment(Point p1 = Point(),Point p2 = Point()): p1(p1),p2(p2) {}
};
typedef Segment Line;
typedef vector<Point> Polygon;
double dot(Vector a,Vector b){ return a.x * b.x + a.y * b.y; }
double det(Vector a,Vector b){ return a.x * b.y - a.y * b.x; }
int ccw(Point p,Segment l){
	if(det(l.p2 - l.p1,p - l.p1) > EPS) return 1;
	if(det(l.p2 - l.p1,p - l.p1) < -EPS) return -1;
	if(dot(l.p2 - l.p1,p - l.p1) < -EPS) return 2;
	if((l.p2 - l.p1).norm() < (p - l.p1).norm()) return -2;
	return 0;
}
bool cross(Segment s1,Segment s2){
	return ccw(s1.p1,s2) * ccw(s1.p2,s2) <= 0 && ccw(s2.p1,s1) * ccw(s2.p2,s1) <= 0;
}
Polygon convexHull(int n,Point* p){
	sort(p + 1,p + n + 1);
	int k = 0;
	Polygon con(n << 1);
	for(int i=1;i<=n;i++){
		while(k > 1 && det(p[i] - con[k - 1],con[k - 2] - con[k - 1]) < EPS) k--;
		con[k++] = p[i];
	}
	int t = k;
	for(int i=n-1;i>=1;i--){
		while(k > t && det(p[i] - con[k - 1],con[k - 2] - con[k - 1]) < EPS) k--;
		con[k++] = p[i];
	}
	con.resize(max(1,k - 1));
	return con;
}
Point bl[maxn],wh[maxn];
int n,m;
bool inside(Point p,Polygon po){
	int k = po.size();
	for(int i=0;i<k;i++){
		int ind = ccw(p,Segment(po[i],po[(i + 1) % k]));
		if(ind != 1 && ind != 0) return false;
	}
	return true;
}
int main(){
	while(~scanf("%d%d",&n,&m) && n){
		for(int i=1;i<=n;i++) scanf("%lf%lf",&bl[i].x,&bl[i].y);
		for(int i=1;i<=m;i++) scanf("%lf%lf",&wh[i].x,&wh[i].y);
		Polygon con1 = convexHull(n,bl);
		Polygon con2 = convexHull(m,wh);
		int k1 = con1.size(), k2 = con2.size();
		bool ok = true;
		ok &= !inside(con1[0],con2);
		ok &= !inside(con2[0],con1);
		if(k1 != 1 && k2 != 1)
			for(int i=0;i<k1;i++){
				for(int j=0;j<k2;j++){
					if(cross(Segment(con1[i],con1[(i + 1) % k1]),Segment(con2[j],con2[(j + 1) % k2]))) ok = false;
				}
			}
		if(ok) puts("YES");
		else puts("NO");
 	}
	return 0;
}

