2 5 10
2 2
1 1
1 4
2 1
1 2
1 5
2 4
2 5
1 3
2 3
 2 2 2
1 1
2 2
 3 3 9
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
 7 5 35
5 3
3 5
1 1
2 5
6 4
7 2
5 1
3 4
6 5
7 3
4 1
2 2
4 2
2 4
4 3
3 3
6 1
1 2
4 5
1 3
2 1
5 5
7 5
7 1
6 2
1 4
1 5
3 2
4 4
5 2
2 3
6 3
7 4
5 4
3 1
 1 5 4
1 1
1 2
1 4
1 5
 1 1 1
1 1
 5 7 21
4 4
4 5
5 5
5 6
5 7
5 1
5 2
4 2
3 2
3 1
3 7
3 6
2 6
1 6
1 7
1 1
1 2
1 3
1 4
2 4
3 4
 2 1 1
1 1
 2 2 4
2 1
1 1
1 2
2 2
 3000 3000 1
2222 738
 5 7 35
1 2
2 3
5 1
5 7
4 4
5 3
3 1
2 6
4 5
2 7
4 1
2 1
2 2
1 7
5 6
3 6
4 6
1 6
1 1
3 3
3 4
4 2
2 5
5 5
3 5
2 4
1 5
1 3
4 3
5 4
1 4
3 7
4 7
3 2
5 2
 5 4 1
4 1
 3 4 12
2 3
3 2
2 2
2 1
1 2
3 1
1 4
1 3
3 3
2 4
3 4
1 1
 3 3 3
1 1
2 2
3 3

8
 1
 6
 26
 4
 0
 20
 0
 2
 1
 28
 1
 9
 3

#include <bits/stdc++.h>
using namespace std;
#define in ({int x=0;int c=getchar(),n=0;for(;!isdigit(c);c=getchar()) n=(c=='-');for(;isdigit(c);c=getchar()) x=x*10+c-'0';n?-x:x;})
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l,int r){return l+rng()%(r-l+1);}
#define fasty ios_base::sync_with_stdio(0),cin.tie(0);
#define forinc(a,b,c) for(int a=b,_c=c;a<=_c;++a)
#define fordec(a,b,c) for(int a=b,_c=c;a>=_c;--a)
#define forv(a,b) for(auto&a:b)
#define fi first
#define se second
#define pb push_back
#define ii pair<int,int>
#define mt make_tuple
#define all(a) a.begin(),a.end()
#define reset(f, x) memset(f, x, sizeof(f))
#define gg exit(0);

int D[]={-1,-1,-1,0,1,1,1,0};
int C[]={-1,0,1,1,1,0,-1,-1};

const int N=3010*3010;

struct info{
    int l1,r1,l2,r2,to;
}T[N];

int m,n,k,tot,mode,invalid;

stack<tuple<int,int,info,info>> cache;

int giao(int x,int y,int u,int v){
    return x-1<=u&&u<=y+1 || u-1<=x&&x<=v+1;
}

void add(int s,int l,int r){
    if(giao(T[s].l1,T[s].r1,l,r))
        T[s].l1=min(T[s].l1,l), T[s].r1=max(T[s].r1,r);
    if(!T[s].l2 || giao(T[s].l2,T[s].r2,l,r))
        T[s].l2=min(T[s].l2,l), T[s].r2=max(T[s].r2,r);
    if(T[s].l2 && giao(T[s].l1,T[s].r1,T[s].l2,T[s].r2))
        T[s].l1=min(T[s].l1,T[s].l2), T[s].r1=max(T[s].r1,T[s].r2);
}

int root(int i){
    return !T[i].to ? i : root(T[i].to);
}

void add(int a,int b,int c,int d){
    int x=(a-1)*n+b, y=(c-1)*n+d;
    if(T[y].to<0) return;
    if((x=root(x))==(y=root(y))) return;
    if(mode) cache.push(mt(x,y,T[x],T[y]));
    add(x,T[y].l1,T[y].r1);
    if(T[y].l2) add(x,T[y].l2,T[y].r2);
    invalid|=T[x].l1==1 && T[x].r1==n;
    T[y].to=x;
}

main(){
    #define task "TASK"
    if(fopen(task".inp","r")){
        freopen(task".inp","r",stdin);
        //freopen(task".out","w",stdout);
    }

    m=in,n=in,k=in;

    if(n==1) return cout<<0,0;

    forinc(i,1,m) forinc(j,1,n)
        T[(i-1)*n+j].l1=T[(i-1)*n+j].r1=j, T[(i-1)*n+j].to=-1;
    //while(k--){
    forinc(w,1,k){
        int x=in,y=in;

        T[(x-1)*n+y].to=0;

        mode=1;
        forinc(t,0,7){
            int u=x+D[t], v=y+C[t];
            if(v<0) v=n; if(v>n) v=1;
            if(1>u||u>m||1>v||v>m) continue;
            add(x,y,u,v);
        }
        mode=0;

        if(w==3){
            //cout<<T[7].l1<<" "<<T[7].r1;
            //gg
        }

        if(invalid){
            invalid=0;
            while(cache.size()){
                int x,y; info u,v;
                tie(x,y,u,v)=cache.top(); cache.pop();
                T[x]=u;
                T[y]=v;
            }
        } else{
            tot++;
            while(cache.size())
                cache.pop();
        }
    }
    //forinc(i,1,m*n) if(!T[i].to) cout<<i<<" ";
    //cout<<T[4].l1<<" "<<T[4].r1;
    //gg
    cout<<tot;
}

