/*
TASK: tetetent
LANG: C++
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <deque>
#include <map>
#include <set>
using namespace std;
typedef vector<int> vect;
typedef map<int,vect> MAP;
typedef multiset<int> SET;
int W,H,S,N;
int X[200010],Y[200010];
MAP red;
deque<int> in_c;
// getting dists
map<int,int> BR;
set<int> P;
SET D;
void rem(int y){
  int V=(--BR[y]);
  if(V==0){
   BR.erase(y);
   set<int>::iterator it,nit;
   it=P.find(y);
   nit=it;nit++;
   if(nit!=P.end())D.erase(D.find(*nit-*it));
   if(it!=P.begin()){
    nit=it;--nit;
    D.erase(D.find(*it-*nit));
                    }
   P.erase(it);
   it=P.lower_bound(y);
   if(it!=P.end()){
    if(it!=P.begin()){
     nit=it;--nit;
     D.insert(*it-*nit);
                     }
                  }
          }
}
void add(int y){
  ++BR[y];
  if(BR[y]>1)return;
  set<int>::iterator it,nit;
  it=P.lower_bound(y);
  if(it!=P.end()){
    if(it!=P.begin()){
     nit=it;--nit;
     D.erase(D.find(*it-*nit));
                     }
                 }
  P.insert(y);
  it=P.find(y);
  nit=it;nit++;
  if(nit!=P.end())D.insert(*nit-*it);
  if(it!=P.begin()){
   nit=it;--nit;
   D.insert(*it-*nit);
                   }
}
inline int max_d(){
  if(D.empty())return 1200000000;
  SET::iterator it=D.end();--it;
  return *it;
}
int main(){
  bool is_00_in=false;
  int i,j,k,l;
  scanf("%d%d%d",&W,&H,&S);
  add(0);add(H);
  scanf("%d",&N);
  for(i=0;i<N;++i){
   scanf("%d%d",&X[i],&Y[i]);
   red[X[i]].push_back(Y[i]);
   if(X[i]==0 && Y[i]==0)is_00_in=true;
                  }
  if(!is_00_in){
   X[N]=0;Y[N++]=0;
   red[X[N-1]].push_back(Y[N-1]);
               }
  bool found=false;
  MAP::iterator it=red.end();
  do{
   --it;
   int CX=it->first;
   vect &pts=it->second;
   while(!in_c.empty() && in_c.front()-CX>=S){
    vect &del=red[in_c.front()];
    for(i=(int)(del.size())-1;i>=0;--i)
     rem(del[i]);
    in_c.pop_front();
                                             }
   //cout<<CX<<' '<<max_d()<<endl;
   //system("pause");
   if(CX+S<=W && max_d()>=S){found=true;goto end;}
   in_c.push_back(CX);
   for(i=0;i<pts.size();++i)add(pts[i]);
  }while(it!=red.begin());
  end:if(found)printf("YES\n");
      else printf("NO\n");
  return 0;
}
