Cod sursa(job #2629044)

Utilizator RaresFelixTudose Rares Felix RaresFelix Data 18 iunie 2020 18:32:13
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fi("disjoint.in");
ofstream fo("disjoint.out");
/// N este numarul de varfuri
int N;
/// M este numarul de operatiuni
int M;
/// P[i] este parintele varfului i
int P[100001];
/// NRV[i] este egal cu numarul de varfuri din subarborele de radacina i
int NRV[100001];

int stramos(int v)
{
    while (P[v]!=0)
        v=P[v];
    return v;
}

int main()
{
    fi>>N;
    fi>>M;
    for (int i=1;i<=N;i++)
    {
        P[i]=0;
        NRV[i]=1;
    }
    for (int q=1;q<=M;q++)
    {
        int tip;
        fi>>tip;
        if (tip==1)
        {
            /// reuniune
            int x,y;
            fi>>x>>y;
            int sx,sy;
            sx=stramos(x);
            sy=stramos(y);
            /// din enunt sx!=sy
            if (NRV[sx]>=NRV[sy])
            {
                NRV[sx]+=NRV[sy];
                P[sy]=sx;
            }
            else
            {
                NRV[sy]+=NRV[sx];
                P[sx]=sy;
            }
        }
        else
        {
            /// interogare
            int x,y;
            fi>>x>>y;
            int sx,sy;
            sx=stramos(x);
            sy=stramos(y);
            if (sx==sy)
                fo<<"DA\n";
            else
                fo<<"NU\n";
        }
    }
    fi.close();
    fo.close();
    return 0;
}