RT
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5 , inf = 1e9;
int n , m , s , t , head[maxn*maxn] , dep[maxn*maxn] , now[maxn*maxn] , cnt = 1 , ans;
int dir[9][2]={{1 , 3} , {-1 , 3} , {-1 , -3} , {1 , -3} , {3 , 1} , {-3 , 1} , {3 , -1} , {-3 , -1}};
bool vis[maxn][maxn];
struct edge
{
int u , v , w , next;
}e[maxn*maxn];
void Insert(int u , int v , int w)
{
e[++cnt].u=u , e[cnt].v=v , e[cnt].w=w , e[cnt].next=head[u] , head[u]=cnt;
e[++cnt].u=v , e[cnt].v=u , e[cnt].w=0 , e[cnt].next=head[v] , head[v]=cnt;
}
bool Bfs()
{
for (int i = 1; i <= n; i++)dep[i]=inf , now[i]=head[i];
queue <int>q;
q.push(s),dep[s]=0;
while(q.size())
{
int u = q.front();
q.pop();
for (int i = head[u]; i; i = e[i].next)
{
int v = e[i].v , w = e[i].w;
if (w > 0 && dep[v] >= inf)
{
q.push(v);
dep[v] = dep[u] + 1;
if (v == t)return 1;
}
}
}
return 0;
}
int Dfs(int u , int sum)
{
if (u == t)return sum;
int res = 0;
for (int i = now[u]; i && sum > 0; i = e[i].next)
{
now[u] = i;
int v = e[i].v , w = e[i].w;
if (w > 0 && dep[v] == dep[u] + 1)
{
int k = Dfs(v , min(w , sum));
if (k <= 0)dep[v]=0;
e[i].w-=k;
e[i^1].w+=k;
sum-=k;
res+=k;
}
}
return res;
}
void Dinic(){while(Bfs())ans+=Dfs(s , inf);}
bool check(int x , int y){return x >= 1 && x <= n && y >= 1 && y <= m && vis[x][y]^1;}
int d(int x , int y){return (x - 1) * n + y;}
int main ()
{
int k , tmp = 0;
scanf("%d%d%d" , &n , &m , &k);
s = n * m + 1 , t = n * m + 2;
for (int i = 1 , x , y; i <= k; i++)scanf("%d%d" , &x , &y),tmp+=vis[x][y]^1,vis[x][y]=1;
for (int i = 1; i <= n; i++)
{
if (i & 1 ^ 1)
{
for (int j = 1; j <= m; j++)
{
Insert(s , d(i , j) , 1);
if (check(i , j) ^ 1)continue;
for (int k = 0; k < 8; k++)
{
int dx = i + dir[k][0] , dy = j + dir[k][1];
if (check(dx , dy))Insert(d(i , j) , d(dx , dy) , 1);
}
}
}
else for (int j = 1; j <= m; j++) Insert(d(i , j) , t , 1);
}
n = t;
Dinic();
printf("%d\n" , n - 2 - ans - tmp);
return 0;
}