#include <iostream>
using namespace std;
const int N=1000010;
//记录父根
int p[N];
int n,m,k;
int find(int x){
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
void sovel()
{
cin>>n>>m>>k;
//初始化每个植物都没有节外生枝
for(int i=1;i<=n*m;i++)
{
p[i]=i;
}
//合并树根
while(k--)
{
int a,b;cin>>a>>b;
int pa=find(a),pb=find(b);
if(pa!=pb) p[pa]=pb;
}
//注意这部分不要放k里面了,这里是对已经合并完的树根进行处理
int res=0;
for(int i=1;i<=n*m;i++)
{
if(p[i]==i)res++;
}
cout<<res<<endl;
}
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
int t=1;
while(t--)
sovel();
return 0;
}