There are N dots in a two-dimensional plane. The coordinates of the i-th dot are (x_i, y_i).

We will repeat the following operation as long as possible:

* Choose four integers a, b, c, d (a \neq c, b \neq d) such that there are dots at exactly three of the positions (a, b), (a, d), (c, b) and (c, d), and add a dot at the remaining position.



We can prove that we can only do this operation a finite number of times. Find the maximum number of times we can do the operation.

Constraints

* 1 \leq N \leq 10^5
* 1 \leq x_i, y_i \leq 10^5
* If i \neq j, x_i \neq x_j or y_i \neq y_j.
* All values in input are integers.

Input

Input is given from Standard Input in the following format:


N
x_1 y_1
:
x_N y_N


Output

Print the maximum number of times we can do the operation.

Examples

Input

3
1 1
5 1
5 5


Output

1


Input

2
10 10
20 20


Output

0


Input

9
1 1
2 1
3 1
4 1
5 1
1 2
1 3
1 4
1 5


Output

16
#include <bits/stdc++.h>
const int INF=1e9;
const int MOD=1e9+7;
//const int MOD=998244353;
const long long LINF=1e18;
using namespace std;
#define int long long
#define fin {cout<<"Bad"<<endl;return 0;}
//template
int M=2e5+4;
vector<int> r(M,1),p(M,0),sx(M,0),sy(M,0);

int find(int x){
  return (x==p[x]?x:p[x]=find(p[x]));
}
bool same(int x,int y){
  return find(x)==find(y);
}
void unite(int a,int b){
  a=find(a);b=find(b);
  if(a==b) return;
  if(r[a]<r[b]) swap(a,b);
  r[a]+=r[b];
  p[b]=a;
  sx[a]+=sx[b];
  sy[a]+=sy[b];
}
//main
signed main(){
  for(int i=0;i<M;i++)p[i]=i;
  for(int i=0;i<=1e5;i++)sx[i]++;
  for(int i=1e5+1;i<M;i++)sy[i]++;

  int N;cin>>N;
  set<int> s;
  for(int i=0;i<N;i++){
    int x,y;cin>>x>>y;y+=1e5;
    unite(x,y);
    s.insert(x);s.insert(y);
  }
  int ans=-N;

  set<int> t;
  for(int q:s)t.insert(find(q));
  for(int q:t)ans+=sx[q]*sy[q];
  cout<<ans<<endl;
}
