Cod sursa(job #2291022)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 27 noiembrie 2018 12:45:16
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include<stdio.h>
#include<stdlib.h>

#include<queue>
#include<stack>
#include<vector>
#include<list>

#include <fstream>
#include <iostream>

using namespace std;

#define MAXN 100000
#define MAXM 100000

int M,N;

int A[MAXN+1];
list<int> L[MAXN+1];

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

void reuniune(int x,int y){
	int nx=L[A[x]].size();
	int ny=L[A[y]].size();
	list<int>::iterator it;
	int ax=A[x];
	int ay=A[y];
	if(nx>ny){
		for(it=L[ay].begin();it!=L[ay].end();it++){
			A[*it]=A[x];
		}
		L[A[x]].splice(L[A[x]].end(), L[ay]);
	}
	else{
		for(it=L[ax].begin();it!=L[ax].end();it++){
			A[*it]=A[y];
		}
		L[A[y]].splice(L[A[y]].end(), L[ax]);
	}
}

int main(){

	fin >> N >> M;
	for(int i=1;i<=N;i++){
		A[i]=i;
		L[i].push_back(i);
	}

	int x,y,cod;

	for(int i=0;i<M;i++){
		fin >> cod >> x >> y;
		if(cod==1){
			reuniune(x,y);
		}
		else{
			if(A[x]==A[y])
				fout << "DA" << endl;
			else
				fout << "NU" << endl;
		}
	}

	fin.close();
    fout.close();

	return 0;
}