Cod sursa(job #664185)

Utilizator laurionLaurentiu Ion laurion Data 19 ianuarie 2012 19:38:23
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<cstdio>
#include<iostream>

using namespace std;
int root[100000+10];

int find(int x)
{
    int r = x;
    while(root[r]!=r)
        r=root[r];

    //compresia drumurilor
    while(root[x]!=x)
    {
        int tmp;
        tmp=root[x];
        root[x]=r;
        x=tmp;
    }
    return root[x];
}

void join(int x, int y)
{
	//unim radacinile
    x=find(x);
    y=find(y);

    root[y]=x;
}
bool check(int x, int y)
{
    return find(x) == find(y);
}
int main()
{
	freopen("disjoint.in","r",stdin);
    freopen("disjoint.out","w",stdout);

    int n,m;

    cin>>n>>m;

    for(int i=1;i<=n;++i)
        root[i]=i;
    for(;m;--m)
    {
        int type,x,y;
        cin>>type>>x>>y;
        if(type == 1)
        {
            join(x,y);
//            for(int i=1;i<=n;++i)
//                cerr<<root[i]<<' ';
        }
        else
        {
            cout<<(check(x,y)?"DA":"NU")<<'\n';
        }
    }

    return 0;
}