#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
typedef pair<int,int> P;
int p[100001],r[100001];
void init(){for(int i=0; i<100001; i++)p[i]=i,r[i]=0;}
int find(int x){return (p[x]==x)?x:(p[x]=find(p[x]));}
void unite(int x,int y) {
  x=find(x),y=find(y);
  if(x==y)return;
  if(r[x]<r[y])p[x]=y;
  else{p[y]=x;if(r[x]==r[y])r[x]++;}
}
bool same(int x,int y){return find(x)==find(y);}

int main() {
  init();
  int n,w,h;
  cin >> n >> w >> h;
  P a[n];
  for(int i=0; i<n; i++) cin >> a[i].F >> a[i].S;
  for(int i=0; i<n; i++) {
    for(int j=i+1; j<n; j++) {
      if(a[i].F==a[j].F||a[i].S==a[j].S) unite(i,j);
    }
  }
  set<int> s;
  for(int i=0; i<n; i++) s.insert(find(i));
  vector<int> v;
  for(set<int>::iterator it=s.begin(); it!=s.end(); it++) v.push_back(*it);
  int sum=n-s.size(),ans=1<<30;
  map<int,int> m[4];
  for(int i=0; i<v.size(); i++)for(int j=0; j<4; j++) m[j][v[i]]=1<<30;
  for(int i=0; i<n; i++) {
    m[0][find(i)]=min(m[0][find(i)],a[i].F-1);
    m[1][find(i)]=min(m[1][find(i)],a[i].S-1);
    m[2][find(i)]=min(m[2][find(i)],w-a[i].F);
    m[3][find(i)]=min(m[3][find(i)],h-a[i].S);
  }
  for(int i=0; i<4; i++) {
    int cnt=0;
    for(int j=0; j<v.size(); j++) {
      if(m[i][v[j]]) cnt++;
    }
    ans=min(ans,sum+cnt+(int)v.size()-1);
  }
  if(v.size()==1) ans=sum;
  cout << ans << endl;
  return 0;
}
