Cod sursa(job #1096691)

Utilizator horatiu13Horatiu horatiu13 Data 2 februarie 2014 15:20:18
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#define Nmax 100005
using namespace std;

FILE *fi = fopen("disjoint.in", "r");
FILE *fo = fopen("disjoint.out", "w");
int t[Nmax];
int nr[Nmax];
int m;
int n;

int main()
{
	int cod;
	int x;
	int y;
	
	fscanf(fi, "%d%d", &n, &m);
	for (int i = 1; i <= n; i++)
		t[i] = i, nr[i] = 1;
	
	for (; m; m--)
	{
		fscanf(fi, "%d%d%d", &cod, &x, &y);
		if (cod == 1)
		{
			if (nr[t[x]] >= nr[t[y]]) // x = x+y
			{
				nr[t[x]] = nr[t[x]] + nr[t[y]];
				
				for(int i = 1, j = 1; i <= n && j <= nr[t[y]]; i++)
				{
					if (t[i] == y)
					{
						j++;
						t[i] = t[x];
						nr[i] = 0;
					}
				}
			}
			else				// y = y+x
			{
				nr[t[y]] = nr[t[y]] + nr[t[x]];
				
				for(int i = 1, j = 1; i <= n && j <= nr[t[x]]; i++)
				{
					if (t[i] == x)
					{
						j++;
						t[i] = t[y];
						nr[i] = 0;
					}
				}
			}
		}
		else if (cod == 2)
		{
			if (t[x] == t[y])	fprintf(fo, "DA\n");
			else				fprintf(fo, "NU\n");
		}
	}
	
	return 0;
}