Problem:
Score : 700 points

Problem Statement

Snuke is playing a puzzle game.
In this game, you are given a rectangular board of dimensions R × C, filled with numbers. Each integer i from 1 through N is written twice, at the coordinates (x_{i,1},y_{i,1}) and (x_{i,2},y_{i,2}).

The objective is to draw a curve connecting the pair of points where the same integer is written, for every integer from 1 through N.
Here, the curves may not go outside the board or cross each other.

Determine whether this is possible.

Constraints

1 ≤ R,C ≤ 10^8

1 ≤ N ≤ 10^5

0 ≤ x_{i,1},x_{i,2} ≤ R(1 ≤ i ≤ N)

0 ≤ y_{i,1},y_{i,2} ≤ C(1 ≤ i ≤ N)

All given points are distinct.

All input values are integers.

Input

Input is given from Standard Input in the following format:

R C N
x_{1,1} y_{1,1} x_{1,2} y_{1,2}
:
x_{N,1} y_{N,1} x_{N,2} y_{N,2}

Output

Print YES if the objective is achievable; print NO otherwise.

Sample Input 1

4 2 3
0 1 3 1
1 1 4 1
2 0 2 2

Sample Output 1

YES

The above figure shows a possible solution.

Sample Input 2

2 2 4
0 0 2 2
2 0 0 1
0 2 1 2
1 1 2 1

Sample Output 2

NO

Sample Input 3

5 5 7
0 0 2 4
2 3 4 5
3 5 5 2
5 5 5 4
0 3 5 1
2 2 4 4
0 5 4 1

Sample Output 3

YES

Sample Input 4

1 1 2
0 0 1 1
1 0 0 1

Sample Output 4

NO

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
#include<map>
#include<set>

using namespace std ;

#define pb(n) push_back(n)
#define fi first
#define se second
#define all(r) begin(r),end(r)
#define vmax(ary) *max_element(all(ary))
#define vmin(ary) *min_element(all(ary))
#define debug(x) cout<<#x<<": "<<x<<endl
#define fcout(n) cout<<fixed<<setprecision((n))
#define scout(n) cout<<setw(n)
#define vary(type,name,size,init) vector< type> name(size,init)
#define vvl(v,w,h,init) vector<vector<ll>> v(w,vector<ll>(h,init))
#define mp(a,b) make_pair(a,b)

#define rep(i,n) for(int i = 0; i < (int)(n);++i)
#define REP(i,a,b) for(int i = (a);i < (int)(b);++i)
#define repi(it,array) for(auto it = array.begin(),end = array.end(); it != end;++it)
#define repa(n,array) for(auto &n :(array))

using ll = long long;
using pii = pair<int,int> ;
using pll = pair<ll,ll> ;

ll r,c,n,x,y,w ,z;
bool judge(pll p){
  ll x = p.fi,y = p.se;
  return (x == 0 || x == r) || (y == 0 || y == c);
}

int f(pll a){
  if(a.fi == 0 ){
    return 4;
  }
  else if(a.fi == r){
    return 2;
  }
  else if(a.se == 0){
    return 1;
  }
  else if(a.se == r){
    return 3;
  }
  return 0;
}

bool circle(const pair<pll,int> &p,const pair<pll,int> &q){
  pll a = p.fi,b = q.fi;
  if(a.fi == 0 && b.fi == 0){
    return a.se > b.se;
  }
  else if(a.fi == r && b.fi == r){
    return a.se < b.se;
  }
  else if(a.se == 0 && b.se == 0){
    return a.fi < b.fi;
  }
  else if(a.se == r && b.se == r){
    return a.fi > b.fi;
  }
  else{
    return f(a) < f(b);
  }
}

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> r >> c >> n;
  vector<pair<pll,int>> v(2 * n);
  stack<int> s;
  rep(i,n){
    cin >> x >> y;
    v[i * 2] = mp(mp(x,y),i);
    cin >> x >> y;
    v[i * 2+1] = mp(mp(x,y),i);
  }
  sort(all(v),circle);
  map<ll,int> m;
  rep(i,2 * n){
    if(judge(v[i].fi)){
      m[v[i].se]++;
      /* cout << v[i].fi.fi << ' ' << v[i].fi.se << endl; */
    }
  }
  bool ex[100001] = {};
  rep(i,2 * n){
    if(m[v[i].se] == 2){
      int v2 = v[i].se;
      if(ex[v2] == false){
        s.push(v2);
        ex[v2] = true;
      }
      else{
        if(v2 != s.top()){
          std::cout << "NO" << std::endl;
          return 0;
        }
        s.pop();
        ex[v2] = false;
      }
    }
  }
  cout << "YES" << endl;
  return 0;
}