数组a[x]的含义是个数为x的组有多少个。
利用树状数组更新a,
合并,则原先个数所在的集合-1.
新形成的几何集合.
#include <stdio.h>
#include <cstring>
const int maxn=200010;
int c[maxn+1],f[maxn+1],a[maxn+1];
inline int lowbit(int x)
{
return x&(-x);
}
void update(int x,int p)
{
for(int i=x; i<maxn; i+=lowbit(i))
c[i]+=p;
}
int sum(int x)
{
int ans=0;
for(int i=x; i>0; i-=lowbit(i))
ans+=c[i];
return ans;
}
int find(int x)
{
if(x!=f[x])
return find(f[x]);
return f[x];
}
int binary(int n,int k)
{
int l=1,r=n,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(sum(mid)<k) l=mid+1;
else r=mid-1;
}
return l;
}
int main()
{
int n,m,cc,p,q,k;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) f[i]=i,a[i]=1;
update(1,n);
int nn=n;
while(m--)
{
scanf("%d",&cc);
if(cc==0)
{
scanf("%d%d",&p,&q);
int x=find(p);
int y=find(q);
if(x==y) continue;
update(a[x],-1);
update(a[y],-1);
update(a[x]+a[y],1);
a[x]+=a[y];
f[y]=x;
n--;
}
else
{
scanf("%d",&k);
int t=binary(nn,n-k+1);
printf("%d\n",t);
}
}
return 0;
}