Cod sursa(job #3248693)

Utilizator MegaCoderMinoiu Teodor Mihai MegaCoder Data 12 octombrie 2024 18:02:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.84 kb
#include<fstream>
std::ifstream fin("disjoint.in");
std::ofstream fout("disjoint.out");
const int NMAX=100005;
int t[NMAX], depth[NMAX];
int n, q;
void init()
{
    fin>>n>>q;
    for(int i=1; i<=n; ++i)
        t[i]=i;
}
inline int root(int val)
{
    if(t[val]==val)
        return val;
    int ans=root(t[t[val]]);
    t[val]=ans;
    return ans;
}
inline void unite(int a, int b)
{
    int x=root(a), y=root(b);
    if(depth[x]==depth[y])
    {
        t[y]=x;
        ++depth[x];
        return;
    }
    if(depth[x]<depth[y])
    {
        t[x]=y;
        return;
    }
    t[y]=x;
}
void solve()
{
    int type, a, b;
    for(int i=0; i<q; ++i)
    {
        fin>>type>>a>>b;
        if(type==1)
            unite(a, b);
        else
            fout<<((root(a)==root(b))?"DA\n":"NU\n");
    }
}
int main()
{
    init();
    solve();
    return 0;
}