Cod sursa(job #2504678)

Utilizator Dragono63Stanciu Rares Stefan Dragono63 Data 5 decembrie 2019 12:56:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int par[100001],nr[100001],n,m,aux;
//---------------------------------
void uneste(int x, int y)
{
    int x2=x;
    int y2=y;
    while(x2!=par[x2])
        x2=par[x2];
    while(y2!=par[y2])
        y2=par[y2];
    if(nr[x2]<nr[y2])
    {
        swap(x,y);
        swap(x2,y2);
    }
    if(x2!=y2)
    {
        nr[x2]+=nr[y2];
        par[y2]=x2;
    }
    while(x!=x2)
    {
        aux=par[x];
        par[x]=x2;
        x=aux;
    }
     while(y!=x2)
    {
        aux=par[y];
        par[y]=x2;
        y=aux;
    }
}
//---------------------------------
int nueadoptat(int x, int y)
{
    int x2=x;
    int y2=y;
    while(x2!=par[x2])
    {
        x2=par[x2];
    }
    while(y2!=par[y2])
    {
        y2=par[y2];
    }
    if(par[y2]==par[x2])
        g<<"DA"<<"\n";
    else g<<"NU"<<"\n";
     while(x!=x2)
    {
        aux=par[x];
        par[x]=x2;
        x=aux;
    }
     while(y!=y2)
    {
        aux=par[y];
        par[y]=y2;
        y=aux;
    }
}
//---------------------------------
int main()
{
    f>>n>>m;

    for(int i=1; i<=n; i++)
    {
        par[i]=i;
        nr[i]=1;
    }

    for(int i=0; i<m; i++)
    {
        int p,x,y;
        f>>p>>x>>y;
        if(p==1) uneste(x,y);
        else nueadoptat(x,y);
    }

    return 0;
}