Cod sursa(job #2416324)

Utilizator GoogalAbabei Daniel Googal Data 27 aprilie 2019 13:21:03
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb

#include <fstream>
#include <cassert>
#include <string>
#include <iostream>

using namespace std;

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

const int NMAX = 1e5;
const int DIM = 1e5;

int n, m, pos;

int ssz[1 + NMAX];
int sef[1 + NMAX];

char buff[DIM];

string ans;

int read()
{
    int nr = 0;

    while(!isdigit(buff[pos]))
    {
        if(++pos == DIM)
        {
            in.read(buff, DIM);
            pos = 0;
        }
    }

    while(isdigit(buff[pos]))
    {
        nr = nr * 10 + (buff[pos] - '0');

        if(++pos == DIM)
        {
            in.read(buff, DIM);
            pos = 0;
        }
    }

    return nr;
}

int getsef(int el)
{
    if(sef[el] == el)
        return el;
    else
    {
        sef[el] = getsef(sef[el]);
        return sef[el];
    }
}

int main()
{
    n = read();
    m = read();

    for(int i = 1; i <= n; i++)
    {
        sef[i] = i;
        ssz[i] = 1;
    }

    for(int i = 1; i <= m; i++)
    {
        int p, x, y;

        p = read();
        x = read();
        y = read();

        if(p == 1)
        {
            int bx = getsef(x);
            int by = getsef(y);

            assert(bx != by);

            if(ssz[by] <= ssz[bx])
            {
                sef[by] = bx;
                ssz[bx] += ssz[by];
            }
            else
            {
                sef[bx] = by;
                ssz[by] += ssz[bx];
            }
        }
        else if(p == 2)
        {
            if(getsef(x) == getsef(y))
                ans += "DA\n";
            else
                ans += "NU\n";
        }
    }

    assert(ans.empty() == false);

    out << ans;

    in.close();
    out.close();

    return 0;
}