Pagini recente » Cod sursa (job #598319) | Cod sursa (job #349009) | Cod sursa (job #2753325) | Cod sursa (job #994744) | Cod sursa (job #2212961)
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int N;
int K;
int m[100001];
int sz[100001];
int Find(int a)
{
int c=a;
int root;
deque <int> temp;
while( a != m[a])
{
temp.push_back(a);
a=m[a];
}
root=a;
while(!temp.empty())
{
m[temp.back()]=root;
temp.pop_back();
}
return root;
}
void Check(int a,int b)
{
int root_a=Find(a);
int root_b=Find(b);
if(root_a==root_b) fout<<"DA"<<'\n';
else fout<<"NU"<<'\n';
}
void Init()
{
for(int i=1; i<=N; ++i)
m[i]=i,
sz[i]=1;
}
void Unite(int a,int b)
{
int root_a,root_b;
root_a=Find(a);
root_b=Find(b);
(sz[root_a] > sz[root_b]) ? m[root_b]=root_a,sz[root_b]+=sz[root_a] : m[root_a]=root_b,sz[root_a]+=sz[root_b];
}
void Read()
{
fin>>N>>K;
Init();
int tip,a,b;
for(int i=1; i<=K; ++i)
{
fin>>tip>>a>>b;
if(tip==1) Unite(a,b);
if(tip==2) Check(a,b);
}
fin.close();
fout.close();
}
int main()
{
Read();
return 0;
}