Cod sursa(job #826221)

Utilizator SteveStefan Eniceicu Steve Data 30 noiembrie 2012 14:24:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <string>
#include <cstring>
#include <deque>
#include <stack>
#include <bitset>
#include <list>
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define mp(a,b) make_pair (a, b)
#define ll long long
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)

using namespace std;

typedef struct
{
    int point;
    int marime;
} element;

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

element v[100011];

int Lookup (int nod)
{
    if (v[nod].point == -1) return nod;
    int a = Lookup (v[nod].point);
    v[nod].point = a;
    return a;
}

void Unite (int x, int y)
{
    int a = Lookup (x);
    int b = Lookup (y);
    if (a == b) return;
    if (v[a].marime > v[b].marime)
    {
        v[b].point = a;
        v[a].marime += v[b].marime;
    }
    else
    {
        v[a].point = b;
        v[b].marime += v[a].marime;
    }
}

int main ()
{
    int N, M;
    fin >> N >> M;
    for (int i = 1; i <= N; i++)
    {
        v[i].point = -1;
        v[i].marime = 1;
    }
    for (int i = 0, a, x, y; i < M; i++)
    {
        fin >> a >> x >> y;
        if (a == 1) Unite (x, y);
        else fout << (Lookup (x) == Lookup (y) ? "DA" : "NU") << "\n";
    }
    fin.close ();
    fout.close ();
    return 0;
}