#include <bits/stdc++.h>
using namespace std;
struct vec {
  long double x, y;
  bool operator==(const vec &a) const { return x == a.x && y == a.y; }
  bool operator<(const vec &a) const {
    if (a.x != x) return x < a.x;
    return y < a.y;
  }
  vec operator+(const vec &a) const { return {x + a.x, y + a.y}; }
  vec operator*(const long double &a) const { return {x * a, y * a}; }
  vec operator-(const vec &a) const { return {x - a.x, y - a.y}; }
  vec operator/(const long double &a) const { return {x / a, y / a}; }
  long double len() const { return sqrt(x * x + y * y); }
  long double dot(const vec &a) const { return x * a.x + y * a.y; }
  long double crs(const vec &a) const { return x * a.y - y * a.x; }
  vec proj(const vec &a) const {
    return (a / a.len()) * (*this).dot(a) / a.len();
  }
};
struct P {
  int x, y;
  bool operator<(const P &a) const { return x < a.x; }
};
bool as(P a, P b) { return a.x > b.x; }
long long x, y, z, mod = 1000000007;
vector<int> v[10];
int i, n, m, k, a, d, b, c;
int dx[10] = {0, 1, 0, -1, 0}, dy[10] = {0, 0, 1, 0, -1};
int e;
int o[12];
int l[10];
int j[20];
set<int> s[100100], s1[100100];
queue<int> q;
map<int, int> p;
P u[1];
char r[1];
int main() {
  scanf("%d %d %d", &a, &b, &c);
  for (int t = 1; t <= c; t++) {
    scanf("%d %d", &n, &m);
    s[n].insert(m);
    s1[m].insert(n);
  }
  x = (long long)a * b - c;
  for (int t = 1; t <= a; t++) {
    s[t].insert(0);
    s[t].insert(b + 1);
  }
  for (int t = 1; t <= b; t++) {
    s1[t].insert(0);
    s1[t].insert(a + 1);
  }
  c = 0, d = b + 1;
  n = 1, m = a + 1;
  i = 0;
  a = 1;
  b = 0;
  for (;; i++, i %= 4)
    if (i == 0) {
      set<int>::iterator i = s[a].upper_bound(b);
      int p = min(*i, d) - 1;
      if (p == b) break;
      x -= p - b;
      d = b = p;
      n = a;
    } else if (i == 1) {
      set<int>::iterator i = s1[b].upper_bound(a);
      int p = min(*i, m) - 1;
      if (p == a) break;
      x -= p - a;
      m = a = p;
      d = b;
    } else if (i == 2) {
      set<int>::iterator i = s[a].lower_bound(b);
      i--;
      int p = max(*i, c) + 1;
      if (p == b) break;
      x -= b - p;
      c = b = p;
      m = a;
    } else if (i == 3) {
      set<int>::iterator i = s1[b].lower_bound(a);
      i--;
      int p = max(*i, n) + 1;
      if (p == a) break;
      x -= a - p;
      n = a = p;
      c = b;
    }
  if (!x)
    puts("Yes");
  else
    puts("No");
}
