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 (GCC 9.2.1) (judge verdict: Accepted)

#include <stdio.h>

typedef struct {
	int key, id;
} data;

void merge_sort(data x[], int n)
{
	static data y[200001] = {};
	if (n <= 1) return;
	merge_sort(&(x[0]), n/2);
	merge_sort(&(x[n/2]), (n+1)/2);
	
	int i, p, q;
	for (i = 0, p = 0, q = n/2; i < n; i++) {
		if (p >= n/2) y[i] = x[q++];
		else if (q >= n) y[i] = x[p++];
		else y[i] = (x[p].key < x[q].key)? x[p++]: x[q++];
	}
	for (i = 0; i < n; i++) x[i] = y[i];
}

int main()
{
	int i, j, k, R, C, N, x[2], y[2];
	data d[200001];
	scanf("%d %d %d", &R, &C, &N);
	for (i = 1, k = 0; i <= N; i++) {
		scanf("%d %d %d %d", &(x[0]), &(y[0]), &(x[1]), &(y[1]));
		if (x[0] > 0 && x[0] < R && y[0] > 0 && y[0] < C) continue;
		else if (x[1] > 0 && x[1] < R && y[1] > 0 && y[1] < C) continue;
		
		for (j = 0; j <= 1; j++) {
			if (x[j] == 0) d[k+j].key = y[j];
			else if (y[j] == C) d[k+j].key = C + x[j];
			else if (x[j] == R) d[k+j].key = R + C * 2 - y[j];
			else d[k+j].key = (R + C) * 2 - x[j];
			d[k+j].id = i;
		}
		k += 2;
	}
	merge_sort(d, k);
	
	int flag[100001] = {}, s[100001], head = 0;
	for (i = 0; i < k; i++) {
		j = d[i].id;
		if (flag[j] == 0) {
			s[head++] = j;
			flag[j] = 1;
		} else if (s[head-1] == j) head--;
		else break;
	}
	if (i >= k) printf("YES\n");
	else printf("NO\n");
	fflush(stdout);
	return 0;
}