//Hello. I'm Peter.
#include<cstdio>
#include<iostream>
#include<sstream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<cctype>
#include<ctime>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
typedef long double ld;
#define peter cout<<"i am peter"<<endl
#define input freopen("data.txt","r",stdin)
#define randin srand((unsigned int)time(NULL))
#define INT (0x3f3f3f3f)*2
#define LL (0x3f3f3f3f3f3f3f3f)*2
#define gsize(a) (int)a.size()
#define len(a) (int)strlen(a)
#define slen(s) (int)s.length()
#define pb(a) push_back(a)
#define clr(a) memset(a,0,sizeof(a))
#define clr_minus1(a) memset(a,-1,sizeof(a))
#define clr_INT(a) memset(a,INT,sizeof(a))
#define clr_true(a) memset(a,true,sizeof(a))
#define clr_false(a) memset(a,false,sizeof(a))
#define clr_queue(q) while(!q.empty()) q.pop()
#define clr_stack(s) while(!s.empty()) s.pop()
#define rep(i, a, b) for (int i = a; i < b; i++)
#define dep(i, a, b) for (int i = a; i > b; i--)
#define repin(i, a, b) for (int i = a; i <= b; i++)
#define depin(i, a, b) for (int i = a; i >= b; i--)
#define pi acos(-1.0)
#define eps 1e-10
#define MOD 1000000007
#define MAXN
#define N 200
#define M
int dcmp(double x){//判断x正&#36127;或&#20026;0
    if(fabs(x)<eps) return 0;
    else if(x<0) return -1;
    else return 1;
}
struct Point{
    double x,y;
    Point(){};
    Point(double xx,double yy):x(xx),y(yy){};
    friend bool operator<(const Point A,const Point B){
        return A.x < B.x || (A.x == B.x && A.y < B.y);
    }
};
typedef Point Vector;
void readPoint(Point &a){//&#36755;入一个点
    scanf("%lf %lf",&a.x,&a.y);
}
double sq(double x){//x^2
    return x*x;
}
Vector operator +(const Vector a,const Vector b){//&#20004;向量相加
    return Vector(a.x+b.x,a.y+b.y);
}
Vector operator -(const Vector a,const Vector b){//&#20004;向量相&#20943;
    return Vector(a.x-b.x,a.y-b.y);
}
bool operator ==(const Vector a,const Vector b){//判断&#20004;点或&#20004;向量是否一致
    return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0;
}
double operator *(const Vector a,const Vector b){//&#20004;向量点乘
    return a.x*b.x+a.y*b.y;
}
double operator &(const Vector a,const Vector b){//&#20004;向量叉&#31215;
    return a.x*b.y-a.y*b.x;
}
Vector operator *(const Vector b,const double a){//一个数*一个向量
    return Vector(a*b.x,a*b.y);
}
Vector operator *(const double a,const Vector b){//一个向量*一个数
    return Vector(a*b.x,a*b.y);
}
Point MiddlePoint(Point a,Point b){//求&#20004;点的中点
    return Point((a.x+b.x)/2,(a.y+b.y)/2);
}
double Length(Vector b){//求一个向量的&#38271;度
    return sqrt(b*b);
}
double DistancePointToPoint(Point a,Point b){//求点到点的无向距&#31163;
    return Length(a-b);
}
double DistancePointToLine(Point p,Point a,Vector v){//求点到&#32447;的无向距&#31163;
    Vector w=p-a;
    return fabs((v&w)/Length(v));
}
Point Point_LineBananaLine(Point p1,Vector v,Point p2,Vector w){//求&#20004;&#32447;的交点(前提是&#20004;向量不共&#32447;)
    Vector u=p1-p2;
    double t=(w&u)/(v&w);
    return p1+v*t;
}
double polarAngle(Vector a,Vector b){//求&#20004;个向量的无向&#26497;角(0<=x<=pi)
    double t=(a*b)/Length(a)/Length(b);
    return acos(t);
    //而atan2(double y,double x)求的是一个向量与x&#36724;的有向&#26497;角(-pi<x<=pi)
}
int ConvexHull(Point *p,int n,Point *ch){
    sort(p,p+n);
    int m=0;
    rep(i,0,n){
        while(m>1 && dcmp((ch[m-1]-ch[m-2])&(p[i]-ch[m-2]))<=0) m--;
        ch[m++]=p[i];
    }
    int k=m;
    depin(i,n-2,0){
        while(m>k && dcmp((ch[m-1]-ch[m-2])&(p[i]-ch[m-2]))<=0) m--;
        ch[m++]=p[i];
    }
    ch[m++] = ch[0];
    if(n>1) m--;
    return m;
}
bool SegmentStrictlyBananaSegment(Point p1,Point p2,Point w1,Point w2){//判断&#20004;&#32447;段是否&#20005;格香蕉(不包括端点)
    double x1=(w2-w1)&(p1-w1);
    double x2=(w2-w1)&(p2-w1);
    double x3=(p2-p1)&(w1-p1);
    double x4=(p2-p1)&(w2-p1);
    return dcmp(x1)*dcmp(x2)<0 && dcmp(x3)*dcmp(x4)<0;
}
bool PointInConvex(Point a, Point* ch, int n){
    int i;
    if(n==3){
        if(a.x < min(ch[0].x, ch[1].x) || a.x > max(ch[0].x, ch[1].x)) return false;
        if(a.y < min(ch[0].y, ch[1].y) || a.y > max(ch[0].y, ch[1].y)) return false;
    }
    for(i=1;i<n;i++){
        if( ((ch[i]-ch[i-1])&(a-ch[i-1])) < 0) return false;
    }
    return true;
}
int n,m,num_ch1,num_ch2;
Point black[N],ch1[N],white[N],ch2[N];
int main(){
//    input;
    while(~scanf("%d%d",&n,&m) && (n+m)){
        clr(black);
        clr(white);
        clr(ch1);
        clr(ch2);
        rep(i,0,n){
            readPoint(black[i]);
        }
        num_ch1=ConvexHull(black,n,ch1);
        rep(i,0,m){
            readPoint(white[i]);
        }
        num_ch2=ConvexHull(white,m,ch2);
        bool ok=true;
        if(n==1 && m==1) ok=true;
        else if(n==1){
            if(PointInConvex(black[0],ch2,num_ch2)) ok=false;
            else ok=true;
        }
        else if(m==1){
            if(PointInConvex(white[0],ch1,num_ch1)) ok=false;
            else ok=true;
        }
        //n!=1 && m!=1
        else{
            rep(i,1,num_ch1){
                if(!ok) break;
                rep(j,1,num_ch2){
                    if(SegmentStrictlyBananaSegment(ch1[i],ch1[i-1],ch2[j],ch2[j-1])){
                        ok=false;
                        break;
                    }
                }
            }
            rep(i,0,n){
                if(!ok) break;
                if(PointInConvex(black[i],ch2,num_ch2)) ok=false;
            }
            rep(i,0,m){
                if(!ok) break;
                if(PointInConvex(white[i],ch1,num_ch1)) ok=false;
            }
        }
        printf("%s\n",ok?"YES":"NO");
    }
}

Measured memory_bytes: 1216