#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=1000000+5;
vector<int> V[N];//因为是两个点,无权值之类的,所以不需要构造结构体
int vis[N] = {0};
void dfs(int u)
{
// if(vis[u] == 0)
{
vis[u] = 1;
for(vector<int>::iterator it = V[u].begin(); it != V[u].end(); it++){
int v = *it;
if(vis[v]==0){
dfs(v);
}
}
}
return;
}
int main()
{
int m, n, k;
cin >> m >> n >> k;
for(int i=0; i<k; i++){
int a, b;
cin >> a >> b;
V[a].push_back(b);
V[b].push_back(a); //加了这条语句就AC了,,,太坑了.....
}
int cnt = 0;
for(int i=0; i<m; i++){
for(int j=1; j<=n; j++){
if(vis[i*n+j] == 0){//未被拜访过
cnt++;
dfs(i*n+j);
}
}
}
cout << cnt << endl;
return 0;
}