Problem:
Score : 600 points

Problem Statement

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.

Sample Input 1

3
1 1
5 1
5 5

Sample Output 1

1

By choosing a = 1, b = 1, c = 5, d = 5, we can add a dot at (1, 5). We cannot do the operation any more, so the maximum number of operations is 1.

Sample Input 2

2
10 10
20 20

Sample Output 2

0

There are only two dots, so we cannot do the operation at all.

Sample Input 3

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

Sample Output 3

16

We can do the operation for all choices of the form a = 1, b = 1, c = i, d = j (2 \leq i,j \leq 5), and no more. Thus, the maximum number of operations is 16.

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
#define MP make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int ui;
typedef long double ld;
const int maxn=1e5+10;

inline char gc(){
	return getchar();
	static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++;
}
inline ll rd(){
    ll x=0;char c=gc();bool neg=0;
    while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();}
    while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc();
    return neg?(~x+1):x;
}

int N,p[maxn][2],r[maxn],d[maxn],l[maxn],u[maxn],rnk[maxn];
map<int,int> rl,dl,sl,ul;
bool flag[maxn];
ll ans;
int c1,c2;
bool xh[maxn],yh[maxn];
int stk[maxn],sh;

inline bool cmp1(int a,int b){
	return p[a][0]==p[b][0]?p[a][1]<p[b][1]:p[a][0]<p[b][0];
}

void dfs(int x){
	if(flag[x]) return;
	flag[x]=1;
	stk[++sh]=x;
	if(!xh[p[x][0]]) c1++;
	if(!yh[p[x][1]]) c2++;
	xh[p[x][0]]=yh[p[x][1]]=1;
	if(r[x]) dfs(r[x]);
	if(d[x]) dfs(d[x]);
	if(l[x]) dfs(l[x]);
	if(u[x]) dfs(u[x]);
}

int main(){
    //freopen("","r",stdin);
    N=rd();
    for(int i=1;i<=N;i++) p[i][0]=rd(),p[i][1]=rd(),rnk[i]=i;
    sort(rnk+1,rnk+N+1,cmp1);
	for(int x=N;x;x--){
		int i=rnk[x];
		r[i]=rl[p[i][1]];
		rl[p[i][1]]=i;
		d[i]=dl[p[i][0]];
		dl[p[i][0]]=i;
	}for(int x=1;x<=N;x++){
		int i=rnk[x];
		l[i]=sl[p[i][1]];
		sl[p[i][1]]=i;
		u[i]=ul[p[i][0]];
		ul[p[i][0]]=i;
	}
	
	for(int x=1;x<=N;x++){
		int i=rnk[x];
		if(flag[i]) continue;
		// printf("%d %d %d %d %d\n",i,l[i],r[i],d[i],u[i]);
		c1=0,c2=0;
		dfs(i);
		for(;sh;sh--) xh[p[stk[sh]][0]]=yh[p[stk[sh]][1]]=0;
		ans+=1ll*c1*c2;
	}
	printf("%lld\n",ans-N);
    return 0;
}