#include <bits/stdc++.h>
using namespace std;
const int maxn = 100 * 1000 + 10;
int n, m, d, k, ind, x, y, fr, tmp, fenr[maxn], fenc[maxn], fc, lr, lc, cx, cy;
vector<int> r[maxn], c[maxn];
bool b;
int get(int *arr, int v) {
  int ret = 0;
  for (; v; v -= v & -v) ret += arr[v];
  return ret;
}
void add(int *arr, int loc, int v) {
  for (loc++; loc < maxn; loc += loc & -loc) arr[loc] += v;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m >> k;
  fr = fc = 1;
  lr = n;
  lc = m;
  for (int i = 0; i < k; i++) {
    cin >> x >> y;
    add(fenr, x, 1);
    add(fenr, x + 1, -1);
    add(fenc, y, 1);
    add(fenc, y + 1, -1);
    r[x].push_back(y);
    c[y].push_back(x);
  }
  cx = cy = 1;
  for (int i = 0; i < n; i++) sort(r[i].begin(), r[i].end());
  for (int i = 0; i < m; i++) sort(c[i].begin(), c[i].end());
  while (fr <= lr && get(fenr, fr + 1) == m) fr++;
  while (fr <= lr && get(fenr, lr + 1) == m) lr--;
  while (fc <= lc && get(fenc, fc + 1) == n) fc++;
  while (fc <= lc && get(fenc, lc + 1) == n) lc--;
  while (fr < lr || fc < lc) {
    switch (d) {
      case 0:
        if (lc == cy && b) {
          cout << "No";
          return 0;
        }
        ind = upper_bound(r[cx].begin(), r[cx].end(), cy) - r[cx].begin();
        if (ind < (((int)r[cx].size())) && r[cx][ind] <= lc) {
          cout << "No";
          return 0;
        }
        tmp = get(fenr, cx + 1);
        add(fenr, cx, m - tmp - 1);
        add(fenr, cx + 1, tmp - m + 1);
        add(fenc, cy, 1);
        add(fenc, lc, -1);
        cy = lc;
        break;
      case 1:
        if (lr == cx) {
          cout << "No";
          return 0;
        }
        ind = upper_bound(c[cy].begin(), c[cy].end(), cx) - c[cy].begin();
        if (ind < (((int)c[cy].size())) && c[cy][ind] <= lr) {
          cout << "No";
          return 0;
        }
        tmp = get(fenc, cy + 1);
        add(fenc, cy, n - tmp - 1);
        add(fenc, cy + 1, tmp - n + 1);
        add(fenr, cx, 1);
        add(fenr, lr, -1);
        cx = lr;
        break;
      case 2:
        if (fc == cy) {
          cout << "No";
          return 0;
        }
        ind = lower_bound(r[cx].begin(), r[cx].end(), fc) - r[cx].begin();
        if (ind < (((int)r[cx].size())) && r[cx][ind] <= cy) {
          cout << "No";
          return 0;
        }
        tmp = get(fenr, cx + 1);
        add(fenr, cx, m - tmp - 1);
        add(fenr, cx + 1, tmp - m + 1);
        add(fenc, fc + 1, 1);
        add(fenc, cy + 1, -1);
        cy = fc;
        break;
      case 3:
        if (fr == cx) {
          cout << "No";
          return 0;
        }
        ind = lower_bound(c[cy].begin(), c[cy].end(), fr) - c[cy].begin();
        if (ind < (((int)c[cy].size())) && c[cy][ind] <= cx) {
          cout << "No";
          return 0;
        }
        tmp = get(fenc, cy + 1);
        add(fenc, cy, n - tmp - 1);
        add(fenc, cy + 1, tmp - n + 1);
        add(fenr, fr + 1, 1);
        add(fenr, cx + 1, -1);
        cx = fr;
        break;
    }
    while (fr <= lr && get(fenr, fr + 1) == m) fr++;
    while (fr <= lr && get(fenr, lr + 1) == m) lr--;
    while (fc <= lc && get(fenc, fc + 1) == n) fc++;
    while (fc <= lc && get(fenc, lc + 1) == n) lc--;
    d = (d + 1) % 4;
    b = 1;
  }
  cout << "Yes";
  return 0;
}
