output_description: Print `YES` if the objective is achievable; print `NO` otherwise.
  
  * * *
input_description: 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}
attempt: # coding: utf-8
  import array, bisect, collections, copy, heapq, itertools, math, random, re, string, sys, time
  sys.setrecursionlimit(10 ** 7)
  INF = 10 ** 20
  MOD = 10 ** 9 + 7
  
  
  def II(): return int(input())
  def ILI(): return list(map(int, input().split()))
  def IAI(LINE): return [ILI() for __ in range(LINE)]
  def IDI(): return {key: value for key, value in ILI()}
  
  
  def read():
      R, C, N = ILI()
      num_point = []
      for __ in range(N):
          x_1, y_1, x_2, y_2 = ILI()
          num_point.append([(x_1, y_1), (x_2, y_2)])
      return R, C, N, num_point
  
  
  # 周上を (0, 0) を原点として反時計回りに 1 本の数直線とした時の point の座標を返す．
  # 周上にあるかの判定も行う．
  def change_edge_point(R, C, point):
      x, y = point
      if 0 < x < C or 0 < y < R:
          return False
      if y == 0:
          return x
      elif y == R:
          return C + R + C - x
      if x == 0:
          return C + y
      elif x == R:
          return C + R + C + R - y
  
  
  def solve(R, C, N, num_point):
      point_double = []
      for point in num_point:
          p_1, p_2 = point
          ret_1 = change_edge_point(R, C, p_1)
          ret_2 = change_edge_point(R, C, p_2)
          if ret_1 is False or ret_2 is False:
              continue
          point_double.append((min(ret_1, ret_2), max(ret_1, ret_2)))åç
  
      for p_1, p_2 in itertools.combinations(point_double, 2):
          if p_1[0] == p_2[0] or p_1[1] == p_2[1]:
              return "NO"
  
          if p_1[0] < p_2[0]:
              if p_1[1] > p_2[1]:
                  continue
              else:
                  return "NO"
          elif p_1[0] > p_2[0]:
              if p_1[1] < p_2[1]:
                  continue
              else:
                  return "NO"
  
      return "YES"
  
  
  def main():
      params = read()
      print(solve(*params))
  
  
  if __name__ == "__main__":
      main()
  
problem_description: 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.
samples: [{"input": "4 2 3\n    0 1 3 1\n    1 1 4 1\n    2 0 2 2", "output": "YES\n    \n\n![](https://atcoder.jp/img/arc076/hogehogehoge.png)\n\nThe above figure shows a possible solution.\n\n* * *"}, {"input": "2 2 4\n    0 0 2 2\n    2 0 0 1\n    0 2 1 2\n    1 1 2 1", "output": "NO\n    \n\n* * *"}, {"input": "5 5 7\n    0 0 2 4\n    2 3 4 5\n    3 5 5 2\n    5 5 5 4\n    0 3 5 1\n    2 2 4 4\n    0 5 4 1", "output": "YES\n    \n\n* * *"}, {"input": "1 1 2\n    0 0 1 1\n    1 0 0 1", "output": "NO"}]