#include
#include<bits/stdc++.h>
using namespace std;
//https://www.codechef.com/UATG001/problems/DSUBAGS
class union_find
{
vectorpar;
vectorsiz;
int n;
public:
union_find(int x)
{
n=x;
par.resize(n+1);
siz.resize(n+1);
for(int i=0;i<=n;i++)
{
par[i]=i;siz[i]=1;
}
}
int root(int x)
{
if(x==par[x])
return x;
return par[x]=root(par[x]);
}
bool find(int a,int b)
{
return par[a]==par[b];
}
void un(int a,int b)
{
int ra=root(a);
int rb=root(b);
if(ra==rb)
return;
if(siz[ra]>siz[rb])
{
swap(ra,rb);
}
par[rb]=ra;
siz[rb]+=siz[ra];
}
int getNumberOfSets()
{
unordered_map<int,int>m;
int cmax=0;
for(int i=1;i<=n;i++)
m[par[i]]++;
return m.size();
}
};
int main() {
int n,q;
cin>>n>>q;
union_find obj(n);
for(int it=1;it<=q;it++)
{
int qt;
cin>>qt;
if(qt==1)
{
int a,b;
cin>>a>>b;
obj.un(a,b);
}
else if(qt==2)
{
int a,b;
cin>>a>>b;
if(obj.find(a,b))
cout<<“YES”<<’\n’;
else
{
cout<<“NO”<<’\n’;
}
}
else
{
cout<<obj.getNumberOfSets()<<'\n';
}
}
return 0;
}
TLE Why?