#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
vector<long long> row[maxn], column[maxn];
void add(long long x, long long y) {
  row[x].push_back(y);
  column[y].push_back(x);
}
long long nowX = 1, nowY = 1;
void Debug() {}
int main() {
  long long n, m;
  int k;
  scanf("%lld%lld%d", &n, &m, &k);
  for (int i = 0; i < k; i++) {
    long long x, y;
    scanf("%lld%lld", &x, &y);
    add(x, y);
  }
  for (int i = 1; i <= n; i++) {
    row[i].push_back(0);
    row[i].push_back(m + 1);
  }
  for (int i = 1; i <= m; i++) {
    column[i].push_back(0), column[i].push_back(n + 1);
  }
  for (int i = 0; i <= n; i++) sort(row[i].begin(), row[i].end());
  for (int i = 0; i <= m; i++) sort(column[i].begin(), column[i].end());
  long long cnt = 1;
  long long Up = 0, Down = n + 1, Right = m + 1, Left = 0;
  bool fst = true;
  while (true) {
    long long nxt =
        min(Right, *lower_bound(row[nowX].begin(), row[nowX].end(), nowY));
    nxt--;
    if (!fst && nxt == nowY) break;
    fst = false;
    cnt += nxt - nowY;
    nowY = nxt;
    Up = nowX;
    Debug();
    nxt =
        min(Down, *lower_bound(column[nowY].begin(), column[nowY].end(), nowX));
    nxt--;
    if (nxt == nowX) break;
    cnt += nxt - nowX;
    nowX = nxt;
    Right = nowY;
    Debug();
    nxt =
        max(Left, *(lower_bound(row[nowX].begin(), row[nowX].end(), nowY) - 1));
    nxt++;
    if (nxt == nowY) break;
    cnt += nowY - nxt;
    nowY = nxt;
    Down = nowX;
    Debug();
    nxt = max(
        Up, *(lower_bound(column[nowY].begin(), column[nowY].end(), nowX) - 1));
    nxt++;
    if (nxt == nowX) break;
    cnt += nowX - nxt;
    nowX = nxt;
    Left = nowY;
    Debug();
  }
  Debug();
  if (m * n - k == cnt) {
    printf("Yes\n");
  } else {
    printf("No\n");
  }
  return 0;
}
