#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
const long long MOD = 1e9 + 7;
void chmax(long long &a, long long b) { a = max(a, b); }
void chmin(long long &a, long long b) { a = min(a, b); }
template <typename T>
void print(T out) {
  cout << out << '\n';
}
void print(vector<long long> A) {
  for (long long i = (0); i < (A.size()); i++) {
    cout << A[i];
    cout << (i == A.size() - 1 ? '\n' : ' ');
  }
}
template <typename T1, typename T2>
void print(pair<T1, T2> out) {
  cout << out.first << ' ' << out.second << '\n';
}
long long max(vector<long long> A) {
  long long res = -INF;
  for (long long a : A) chmax(res, a);
  return res;
}
long long min(vector<long long> A) {
  long long res = INF;
  for (long long a : A) chmin(res, a);
  return res;
}
long long max(long long A[], int len) {
  long long res = -INF;
  for (long long i = (0); i < (len); i++) chmax(res, A[i]);
  return res;
}
long long min(long long A[], int len) {
  long long res = INF;
  for (long long i = (0); i < (len); i++) chmin(res, A[i]);
  return res;
}
int r, c, idx, nxt1, nxt2, nxt;
long long H, W, K, cnt;
vector<vector<int>> rows, cols;
pair<int, int> cur;
set<int> visitedr, visitedc;
bool right() {
  r = cur.first;
  c = cur.second;
  idx =
      lower_bound((rows[r]).begin(), (rows[r]).end(), c + 1) - rows[r].begin();
  nxt1 = rows[r][idx] - 1;
  auto itr = visitedc.lower_bound(c + 1);
  nxt2 = *itr - 1;
  nxt = min(nxt1, nxt2);
  if (nxt <= c) {
    return false;
  } else {
    cnt += nxt - c;
    cur.second = nxt;
    visitedr.insert(r);
    return true;
  }
}
bool down() {
  r = cur.first;
  c = cur.second;
  idx =
      lower_bound((cols[c]).begin(), (cols[c]).end(), r + 1) - cols[c].begin();
  nxt1 = cols[c][idx] - 1;
  auto itr = visitedr.lower_bound(r + 1);
  nxt2 = *itr - 1;
  nxt = min(nxt1, nxt2);
  if (nxt <= r) {
    return false;
  } else {
    cnt += nxt - r;
    cur.first = nxt;
    visitedc.insert(c);
    return true;
  }
}
bool left() {
  r = cur.first;
  c = cur.second;
  idx = upper_bound((rows[r]).begin(), (rows[r]).end(), c - 1) -
        rows[r].begin() - 1;
  nxt1 = rows[r][idx] + 1;
  auto itr = prev(visitedc.upper_bound(c - 1));
  nxt2 = *itr + 1;
  nxt = max(nxt1, nxt2);
  if (nxt >= c) {
    return false;
  } else {
    cnt += c - nxt;
    cur.second = nxt;
    visitedr.insert(r);
    return true;
  }
}
bool up() {
  r = cur.first;
  c = cur.second;
  idx = upper_bound((cols[c]).begin(), (cols[c]).end(), r - 1) -
        cols[c].begin() - 1;
  nxt1 = cols[c][idx] + 1;
  auto itr = prev(visitedr.upper_bound(r - 1));
  nxt2 = *itr + 1;
  nxt = max(nxt1, nxt2);
  if (nxt >= r) {
    return false;
  } else {
    cnt += r - nxt;
    cur.first = nxt;
    visitedc.insert(c);
    return true;
  }
}
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cin >> H >> W >> K;
  rows.resize(H);
  cols.resize(W);
  cur = make_pair(0, 0);
  cnt = 1;
  for (long long i = (0); i < (K); i++) {
    cin >> r >> c;
    r--;
    c--;
    rows[r].push_back(c);
    cols[c].push_back(r);
  }
  for (long long i = (0); i < (H); i++) {
    rows[i].push_back(-1);
    rows[i].push_back(W);
    sort((rows[i]).begin(), (rows[i]).end());
  }
  for (long long i = (0); i < (W); i++) {
    cols[i].push_back(-1);
    cols[i].push_back(H);
    sort((cols[i]).begin(), (cols[i]).end());
  }
  visitedr.insert(-1);
  visitedr.insert(H);
  visitedc.insert(-1);
  visitedc.insert(W);
  down();
  if (cnt == H * W - K) {
    print("Yes");
    return 0;
  } else {
    cur = make_pair(0, 0);
    cnt = 1;
    visitedc.clear();
    visitedc.insert(-1);
    visitedc.insert(W);
  }
  while (true) {
    if (!right()) break;
    if (!down()) break;
    if (!left()) break;
    if (!up()) break;
  }
  if (cnt == H * W - K) {
    print("Yes");
  } else {
    print("No");
  }
  return 0;
}
