← Home
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
 
set<int> occupi[100100];
set<int> occupj[100100];
 
int nxt(set<int> &st, int v) {
    return *st.upper_bound(v);
}
 
int prv(set<int> &st, int v) {
    auto p = st.lower_bound(v);
    --p;
    return *p;
}
 
int32_t main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int n, m, k;
    cin >> n >> m >> k;
    for(int i=1;i<=n;i++) occupi[i].insert(0), occupi[i].insert(m+1);
    for(int j=1;j<=m;j++) occupj[j].insert(0), occupj[j].insert(n+1);
    int rem=n*m-k-1;
    while(k--) {
        int i, j;
        cin >> i >> j;
        occupi[i].insert(j);
        occupj[j].insert(i);
    }
    int i=1, j=1;
    int up=1, down=n, left=1, right=m;
    int d=0;
    int mx=0;
    while(true) {
        if(!d) {
            int nj=min(nxt(occupi[i], j)-1, right);
            if(mx&&nj<=j) break;
            rem-=nj-j;
            j=nj;
            up=i+1;
        } else if(d==1) {
            int ni=min(nxt(occupj[j], i)-1, down);
            if(ni<=i) break;
            rem-=ni-i;
            i=ni;
            right=j-1;
        } else if(d==2) {
            int nj=max(prv(occupi[i], j)+1, left);
            if(nj>=j) break;
            rem-=j-nj;
            j=nj;
            down=i-1;
        } else {
            int ni=max(prv(occupj[j], i)+1, up);
            if(ni>=i) break;
            rem-=i-ni;
            i=ni;
            left=j+1;
        }
        ++d;
        d%=4;
        mx=max(mx, d);
    }
    if(rem) {
        cout << "No\n";
    } else {
        cout << "Yes\n";
    }
    return 0;
}