General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
212364608 Practice:
trsins
1140F - 11 C++20 (GCC 11-64) Accepted 1419 ms 182876 KB 2023-07-06 16:32:48 2023-07-06 16:32:48
→ Source
#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;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details