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

#define f first
#define s second

int n,m,k;
int A[2001][2001] = { { 0 } };
int bx=1,by=1;
int tekuca_boja = 1;

//void Prikazi()
//{
//    for ( int g = 1; g <= n; g++ )
//    {
//        for ( int h = 1; h <= m; h++ )
//        {
//            cout << A[g][h] << "    ";
//        }
//        cout << endl;
//    }
//    cout << endl;
//}

bool NadjiBelo()
{
    bool nastavi = true;

    for ( int i = bx; i <= n; i++ )
    {
        for ( int j = nastavi?by:1; j <= m; j++ )
        {
            if ( A[i][j] == 0 )
            {
                bx = i;
                by = j;
                return true;
            }
        }
        nastavi = false;
    }
    return false;
}

void Ofarbaj_Povrsinu()
{
    stack < pair<int,int> > S;
    pair <int,int> p,d; p.f = bx; p.s = by;
    S.push(p);

    while ( !S.empty() )
    {
        p = S.top();
        S.pop();
        A[p.f][p.s] = tekuca_boja;
        if ( p.f+1 <= n && A[p.f+1][p.s] == 0 )
        {
            d.f = p.f+1; d.s = p.s;
            A[d.f][d.s] = tekuca_boja;
            S.push(d);
        }
        if ( p.s-1 >= 1 && A[p.f][p.s-1] == 0 )
        {
            d.f = p.f; d.s = p.s-1;
            A[d.f][d.s] = tekuca_boja;
            S.push(d);
        }
        if ( p.f-1 >= 1 && A[p.f-1][p.s] == 0 )
        {
            d.f = p.f-1; d.s = p.s;
            A[d.f][d.s] = tekuca_boja;
            S.push(d);
        }
        if ( p.s+1 <= m && A[p.f][p.s+1] == 0 )
        {
            d.f = p.f; d.s = p.s+1;
            A[d.f][d.s] = tekuca_boja;
            S.push(d);
        }
    }

    tekuca_boja++;
}

int main()
{
    int p,q;

    cin >> n >> m >> k;
    for ( int g = 0; g < k; g++ )
    {
        cin >> p >> q;
        A[p][q] = -1;
    }
    if ( n > 2000 || m > 2000 )
    {
        cout << 2;
        return 0;
    }

    while ( NadjiBelo() )
    {
        Ofarbaj_Povrsinu();
    }

    cout << tekuca_boja-1 << endl;

    return 0;
}