Cod sursa(job #2654611)

Utilizator raikadoCri Lu raikado Data 1 octombrie 2020 18:45:39
Problema Paduri de multimi disjuncte Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <iostream>
#include <unordered_map>
#include <vector>

using namespace std;

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

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

	unordered_map<int, int> i2s;
	unordered_map<int, vector<int>> s2i;
	for (int i = 1; i <= N; i++)
	{
		i2s[i] = i;
		s2i[i] = vector<int>{i};
	}

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

		if (op == 1)
		{
			auto xit = s2i.find(i2s[x]), yit = s2i.find(i2s[y]);
			auto &xset = xit->second, &yset = yit->second;

			if (xset.size() > yset.size())
			{
				xset.insert(xset.end(), yset.begin(), yset.end());
				for (auto i : yset) i2s[i] = i2s[x];
				s2i.erase(yit);
			} else
			{
				yset.insert(yset.end(), xset.begin(), xset.end());
				for (auto i : xset) i2s[i] = i2s[y];
				s2i.erase(xit);
			}

			// for (auto p: i2s)
			// 	cout << p.first << ": " << p.second << endl;;
			// cout << endl;

			// for (auto &p : s2i) {
			// 	cout << p.first << ": ";
			// 	for (auto i : p.second) {
			// 		cout << i << ' ';
			// 	}
			// 	cout << endl;
			// }
			// cout << "~~~~~~~~~~~~~~~~" << endl;

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

	}

	return 0;
}