#include<bits/stdc++.h>
using namespace std;
#define ls p<<1
#define rs p<<1|1
#define int long long
const int N=6e5+7;
const int lim=3e5;
int n,m,k,fa[N],rk[N],top,szl[N],szr[N],ans;
vector<pair<int,int>>tr[N<<2];
pair<int,int>stk[N];
map<pair<int,int>,int>mps;
inline void update(int p,int l,int r,int s,int t,pair<int,int>pr){
if(s>t)return;
if(s<=l&&r<=t){
tr[p].push_back(pr);
return;
}
int mid=(l+r)>>1;
if(s<=mid)update(ls,l,mid,s,t,pr);
if(t>mid)update(rs,mid+1,r,s,t,pr);
return;
}
inline int find(int x){
while(fa[x]!=x)x=fa[x];
return x;
}
inline void merge(int x,int y){
x=find(x),y=find(y);
if(x==y)return;
if(rk[x]>rk[y])swap(x,y);
ans-=szl[x]*szr[x]+szl[y]*szr[y];
stk[++top]=make_pair(x,rk[x]==rk[y]);
fa[x]=y,rk[y]+=(rk[x]==rk[y]);
szl[y]+=szl[x],szr[y]+=szr[x];
ans+=szl[y]*szr[y];
return;
}
inline void solve(int p,int l,int r){
int lst=top,mid=(l+r)>>1;
for(auto i:tr[p])merge(i.first,i.second);
if(l==r)printf("%lld ",ans);
else solve(ls,l,mid),solve(rs,mid+1,r);
while(top>lst){
int x=stk[top].first,w=stk[top].second;top--;
ans-=szl[fa[x]]*szr[fa[x]];
szl[fa[x]]-=szl[x],szr[fa[x]]-=szr[x];
ans+=szl[fa[x]]*szr[fa[x]]+szl[x]*szr[x];
rk[fa[x]]-=w,fa[x]=x;
}
return;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
int x,y;scanf("%lld%lld",&x,&y);
pair<int,int>p=make_pair(x,y+lim);
if(mps[p])update(1,1,n,mps[p],i-1,p),mps.erase(p);
else mps[p]=i;
}
for(int i=1;i<=lim*2;i++)fa[i]=i,(i<=lim?szl[i]:szr[i])=1;
for(auto i:mps)update(1,1,n,i.second,n,i.first);
solve(1,1,n);
return 0;
}