Cod sursa(job #1695227)

Utilizator leopop29Pop Leonard leopop29 Data 26 aprilie 2016 19:48:07
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NM 100005

using namespace std;

int p[NM];

void u(int x, int y)
{
    while(p[y] != y)
        y = p[y];

    while(p[x] != x)
        x = p[x];

    p[y] = x;
}

vector<int> s;

int fi(int x)
{
    if(p[x] == x)
    {
        for(int i = 0; i < s.size(); ++i)
            p[s[i]] = x;
        s.clear();
        return x;
    }
    else
    {
        s.push_back(x);
        fi(p[x]);
    }
}

bool qu(int x, int y)
{
    int px = fi(x), py = fi(y);
    if(px == py)
        return 1;
    else
        return 0;
}

int main()
{
    ifstream f("disjoint.in");
    ofstream g("disjoint.out");
    int n, q;
    f >> n >> q;

    for(int i = 1; i <= n; ++i)
        p[i] = i;

    for(; q; q--)
    {
        int t, x, y;
        f >> t >> x >> y;

        if(t&1)
            u(x, y);
        else
            if(qu(x, y))
                g << "DA\n";
            else
                g << "NU\n";
    }
}