#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int N = 60010,M = 500010,INF = 1e8;
bool st[N];
int n,m,k,S,T;
int h[N],e[M],f[M],ne[M],idx;
int dep[N],cur[N];
int nx[10] = {1,3,3,1,-1,-3,-3,-1},ny[10] = {3,1,-1,-3,-3,-1,1,3};
void add(int a,int b,int c){
e[idx] = b,f[idx] = c,ne[idx] = h[a],h[a] = idx++;
e[idx] = a,f[idx] = 0,ne[idx] = h[b],h[b] = idx++;
}
bool bfs(){
memset(dep,-1,sizeof dep);
queue<int>q;
dep[S] = 0,cur[S] = h[S],q.push(S);
while(!q.empty()){
auto u = q.front();
q.pop();
for(int i = h[u] ; ~i ; i = ne[i]){
int ver = e[i];
if(dep[ver] == -1 && f[i]){
dep[ver] = dep[u] + 1;
cur[ver] = h[ver];
if(ver == T)return true;
q.push(ver);
}
}
}
return false;
}
int dfs(int u,int limit){
if(u == T)return limit;
int flow = 0;
for(int i = cur[u];~i && flow < limit; i = ne[i]){
cur[u] = i;
int ver = e[i];
if(dep[ver] == dep[u] + 1 && f[i]){
int t = dfs(ver,min(f[i],limit - flow));
if(!t)dep[ver] = -1;
else f[i] -= t,f[i ^ 1] += t,flow += t;
}
}
return flow;
}
int dinic(){
int ans = 0,flow;
while(bfs())while(flow = dfs(S,INF))ans += flow;
return ans;
}
void solve(){
cin >> n >> m >> k;
memset(h,-1,sizeof h);
S = 0,T = n * m + 1;
int ans = n * m;
for(int i = 1;i <= k; i ++){
int x,y;
cin >> x >> y;
if(!st[(x - 1) * m + y])ans--;
st[(x - 1) * m + y] = 1;
}
for(int i = 1;i <= n; i ++){
for(int j = 1;j <= m; j ++){
if(st[(i - 1) * m + j])continue;
if(i & 1){
add(S,(i - 1) * m + j,1);
for(int k = 0;k < 8 ; k++){
int nowx = i + nx[k];
int nowy = j + ny[k];
if(nowx < 1 || nowx > n || nowy < 1 || nowy > m||st[(nowx - 1) * m + nowy])continue;
add((i - 1) * m + j,(nowx - 1) * m + nowy,1);
}
}
else add((i - 1) * m + j,T,1);
}
}
ans -= dinic();
cout << ans << '\n';
}
int main(){
solve();
return 0;
}