Cod sursa(job #2654628)

Utilizator raikadoCri Lu raikado Data 1 octombrie 2020 19:27:34
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <list>

using namespace std;

int main(int argc, char const *argv[])
{
	ifstream fin("disjoint.in");
	ofstream fout("disjoint.out");

	int N, M;
	fin >> N >> M;

	vector<int> i2s;
	vector<list<int>> s2i;
	i2s.reserve(N); s2i.reserve(N);

	for (int i = 0; i < N; i++)
	{
		i2s.push_back(i);
		s2i.push_back(list<int>{i});
	}

	for (int i = 0; i < M; i++)
	{
		int op, x, y;
		fin >> op >> x >> y;
		x--; y--;

		if (op == 1)
		{
			int xid = i2s[x], yid = i2s[y];
			auto &xset = s2i[xid], &yset = s2i[yid];

			if (xset.size() > yset.size())
			{
				// xset.insert(xset.end(), yset.begin(), yset.end());
				for (auto i : yset) i2s[i] = xid;
				// yset.clear();
				xset.splice(xset.end(), yset);
			} else
			{
				// yset.insert(yset.end(), xset.begin(), xset.end());
				for (auto i : xset) i2s[i] = yid;
				// xset.clear();
				yset.splice(yset.end(), xset);
			}

		} else {
			if (i2s[x] == i2s[y])
				fout << "DA\n";
			else
				fout << "NU\n";
		}

	}

	return 0;
}