#include <bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 10;
vector<int> g[maxn];
bool vis[maxn];
int n, m, q;
void add(int x, int y) { g[x].push_back(y); }
void dfs(int x) {
  int si = g[x].size();
  vis[x] = true;
  for (int i = 0; i < si; i++) {
    int to = g[x][i];
    if (vis[to]) continue;
    dfs(to);
  }
}
void work() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 0; i < q; i++) {
    int r, c;
    scanf("%d%d", &r, &c);
    add(r - 1, c - 1 + n);
    add(c - 1 + n, r - 1);
  }
  long long ans = 0;
  for (int i = 0; i < n + m; i++) {
    if (!vis[i]) {
      dfs(i);
      ans++;
    }
  }
  printf("%lld\n", ans - 1);
}
int main() {
  work();
  return 0;
}
