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>
using namespace std;
typedef long long ll;
#define FOR(I,A,B) for(ll I = ll(A); I < ll(B); ++I)

class UnionFind{
public:
	vector<int> par;
	//0-indexed
	UnionFind(int n){init(n);}
	void init(int n = 1) {
		par.resize(n);
		for(int i=0;i<n;++i)par[i]=i;
	}
	int root(int x = 1){
		if(par[x]==x)return x;
		return par[x]=root(par[x]);
	}
	void unite(int x = 1,int y = 1){
		x = root(x);
		y = root(y);
		if(x==y)return;
		par[x] = y;
	}
};

int main(){
	ll N,xi,yi,ans=0;
	cin >> N;
	UnionFind uf(N);
	vector<ll> x(100001,-1),y(100001,-1),nx(N,0),ny(N,0);
	FOR(i,0,N){
		cin >> xi >> yi;
		if((x[xi]==-1)&&(y[yi]==-1)){
			x[xi] = y[yi] = i;
		}else if((x[xi]!=-1)&&(y[yi]==-1)){
			y[yi] = x[xi];
		}else if((x[xi]==-1)&&(y[yi]!=-1)){
			x[xi] = y[yi];
		}else{
			uf.unite(x[xi],y[yi]);
		}
	}
	FOR(i,0,100001){
		if(x[i]!=-1)nx[uf.root(x[i])]++;
		if(y[i]!=-1)ny[uf.root(y[i])]++;
	}
	FOR(i,0,N){
		ans += nx[i]*ny[i]-1;
	}
	cout << ans << endl;
}