#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll MOD = 1e9+7;
const int N = 1e5+5;
const int dirx[]={-1,0,1,0};
const int diry[]={0,1,0,-1};

int n,m,k;
pair<int,int>a[N];
int par[N];
int sz[N];
int ans;
map<pair<int,int>,int>mp;
vector<int>v;
int b[1005][1005];
bool vis[1005][1005];

bool can(int x,int y){
    return x>=1&&x<=n&&y>=1&&y<=m&&b[x][y]!=-1&&!vis[x][y];
}

void dfs(int x,int y){
    vis[x][y]=true;
    for(int i=0;i<4;i++){
        if(can(x+dirx[i],y+diry[i])){
            dfs(x+dirx[i],y+diry[i]);
        }
    }
}

bool cmp(const pair<int,int> &fi,const pair<int,int> &se){
    if(fi.first!=se.first)return fi.first<se.first;
    return fi.second<se.second;
}

int Find(int x){
    if(par[x]==x)return par[x];return par[x]=Find(par[x]);
}

void Merge(int fii,int see){
    if(fii!=see){
        if(sz[fii]<sz[see])swap(fii,see);
        par[see]=fii;
        if(sz[fii]==sz[see])sz[fii]++;
    }
}

void con(int x,int y,int ind){
    int parl=-1,parr=-1;
    if(mp[{x-1,y}])parl=mp[{x-1,y}];
    else if(mp[{x-1,y-1}])parl=mp[{x-1,y-1}];
    else if(mp[{x,y-1}])parl=mp[{x,y-1}];

    if(mp[{x-1,y}])parr=mp[{x-1,y}];
    else if(mp[{x-1,y+1}])parr=mp[{x-1,y+1}];
    else if(mp[{x,y+1}])parr=mp[{x,y+1}];

    int newparl=-1;
    int newparr=-1;

    if(x==1){
        if(parl==-1)parl=k+1;
        if(parr==-1)parr=k+1;
    }else if(x==n){
        if(y==1){
            if(parl==-1)parl=k+1;
        }else if(y==m){
            if(parr==-1)parr=k+1;
        }
    }else{
        if(y==1){
            if(parl==-1)parl=k+1;
        }else if(y==m){
            if(parr==-1)parr=k+1;
        }
    }


    if(parl!=-1)newparl=Find(parl);
    if(parr!=-1)newparr=Find(parr);




    if(newparl!=-1&&newparr!=-1){
        if(!mp[{x-1,y}]&&newparl==newparr&&x>=2){
            ans++;
        }
        Merge(newparl,Find(ind));
        Merge(newparr,Find(ind));
    }else{
        if(newparl==-1){
            if(newparr!=-1){
                Merge(newparr,Find(ind));

            }
        }else{
            Merge(newparl,Find(ind));

        }
    }

}

int main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++){
        cin>>a[i].first>>a[i].second;
    }

    if(n==1){
        a[0]={1,0};
        a[k+1]={1,m+1};
        for(int i=1;i<=k;i++){
            if(a[i].second-a[i-1].second!=1)ans++;
        }
        if(a[k].second==m)ans--;
        cout<<ans+1;
        return 0;
    }else if(m==1){
        a[0]={0,1};
        a[k+1]={n+1,1};
        for(int i=1;i<=k;i++){
            if(a[i].first-a[i-1].first!=1)ans++;
        }
        if(a[k].first==n)ans--;
        cout<<ans+1;
        return 0;
    }


    //border
    par[k+1]=k+1;
    sz[k+1]=1;


    sort(a+1,a+1+k,cmp);
    vector<int>Top,Down,Left,Right;

    for(int i=1;i<=k;i++){
        mp[{a[i].first,a[i].second}]=i;
        sz[i]=1;
        par[i]=i;

        if(a[i].first==1){
            Top.push_back(i);
        }
        if(a[i].first==n){
            Down.push_back(i);
        }
        if(a[i].second==1){
            Left.push_back(i);
        }
        if(a[i].second==m){
            Right.push_back(i);
        }
        con(a[i].first,a[i].second,i);

    }


    for(auto e:Down){
        int x=a[e].first;
        int y=a[e].second;
        if(Find(e)==Find(k+1)&&!mp[{x,y-1}]&&!mp[{x,y+1}]&&y>=2&&y<=m-1){
            ans++;
        }
    }


    cout<<ans+1;
    return 0;
}

/*
4 4 4
1 1
2 2
3 1
4 2
*/


/*
4 4 6
1 1
1 3
2 2
2 4
3 3
3 4
*/

/*
4 4 5
1 1
1 3
2 2
3 3
4 4
*/


/*

*/


/*
11 12 47
1 1
1 2
1 7
1 8
1 11
1 12
2 3
2 4
2 6
2 7
2 9
2 10
3 4
3 5
4 11
4 12
5 4
5 5
5 11
5 12
6 3
6 6
6 7
6 10
6 12
7 3
7 4
7 5
7 6
7 10
8 4
8 10
8 11
8 12
9 7
9 8
9 10
9 11
10 3
10 5
10 7
10 9
10 10
11 2
11 6
11 8
11 10


*/


/*
5 5 8
2 4
2 5
3 1
3 3
4 2
4 5
5 2
5 4

*/