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: Accepted)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> lpair;
const ll MOD = 1e9 + 7;
const ll INF = 1e18;
#define rep(i,m,n) for(ll i = (m); i < (n); i++)
#define rrep(i,m,n) for(ll i = (m); i >= (n); i--)
#define print(x) cout << (x) << endl;
#define print2(x,y) cout << (x) << " " << (y) << endl;
#define printa(x,n) for(ll i = 0; i < n; i++){ cout << (x[i]) << " ";} cout<<endl;

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    ll R,C,N;
    cin >> R >> C >> N;
    ll x1[100010], y1[100010], x2[100010], y2[100010];
    rep(i,0,N) cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
    vector<ll> v;
    rep(i,0,N){
        if((x1[i] == 0 || x1[i] == R) || (y1[i] == 0 || y1[i] == C)){
            if((x2[i] == 0 || x2[i] == R) || (y2[i] == 0 || y2[i] == C)){
                v.push_back(i);
            }
        }
    }
    vector<lpair> l1,l2,l3,l4;
    ll n = v.size();
    // printa(v,n);
    rep(t,0,n){
        ll i = v[t];
        if(x1[i] == 0 && y1[i] != C){
            l1.push_back(make_pair(y1[i], i));
        }else if(y1[i] == C && x1[i] != R){
            l2.push_back(make_pair(x1[i], i));
        }else if(x1[i] == R && y1[i] != 0){
            l3.push_back(make_pair(y1[i], i));
        }else{
            l4.push_back(make_pair(x1[i], i));
        }

        if(x2[i] == 0 && y2[i] != C){
            l1.push_back(make_pair(y2[i], i));
        }else if(y2[i] == C && x2[i] != R){
            l2.push_back(make_pair(x2[i], i));
        }else if(x2[i] == R && y2[i] != 0){
            l3.push_back(make_pair(y2[i], i));
        }else{
            l4.push_back(make_pair(x2[i], i));
        }
    }
    sort(l1.begin(), l1.end());
    sort(l2.begin(), l2.end());
    sort(l3.begin(), l3.end(), greater<lpair>());
    sort(l4.begin(), l4.end(), greater<lpair>());
    vector<lpair> lp;
    rep(i,0,l1.size()) lp.push_back(l1[i]);
    rep(i,0,l2.size()) lp.push_back(l2[i]);
    rep(i,0,l3.size()) lp.push_back(l3[i]);
    rep(i,0,l4.size()) lp.push_back(l4[i]);
    stack<lpair> st;
    // rep(i,0,l2.size()){
    //     print2(l2[i].first, l2[i].second);
    // }
    // rep(i,0,lp.size()){
    //     print2(lp[i].first, lp[i].second);
    // }
    rep(i,0,lp.size()){
        if(st.empty()){
            st.push(lp[i]);
        }else{
            lpair tt = st.top();
            if(tt.second == lp[i].second){
                st.pop();
            }else{
                st.push(lp[i]);
            }
        }
    }
    if(st.size() == 0){
        print("YES");
    }else{
        print("NO");
    }
    
    // rep(i,0,n){
    //     rep(j,0,n){
    //         if(i >= j) continue;
    //         P p1(x1[v[i]], y1[v[i]]);
    //         P p2(x2[v[i]], y2[v[i]]);
    //         P p3(x1[v[j]], y1[v[j]]);
    //         P p4(x2[v[j]], y2[v[j]]);
    //         bool is_cross = intersected(p1,p2,p3,p4);
    //         if(is_cross){
    //             print("NO");
    //             return 0;
    //         }

    //     }
    // }
    
}