Cod sursa(job #636277)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 19 noiembrie 2011 18:15:32
Problema Paduri de multimi disjuncte Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <stdio.h>
#include <string.h>
using namespace std;

//ifstream f("disjoint.in");
//ofstream g("disjoint.out");
FILE *f=fopen("disjoint.in","r");
FILE *g=fopen("disjoint.out","w");
int n,x,y,op,r[1000015],t;

inline void upgrade(int x,int y){
	register int rx=x,ry=y;
	while(r[rx]>0)
		rx=r[rx];
	while(r[ry]>0)
		ry=r[ry];
	if(r[rx]<r[ry]){
		r[rx]+=r[ry];
		r[ry]=rx;
	}
	else{
		r[ry]+=r[rx];
		r[rx]=ry;
	}
	
}

inline bool querry(int x,int y){
	register int rx=x,ry=y;
	while(r[rx]>0)
		rx=r[rx];
	while(r[ry]>0)
		ry=r[ry];
	return (rx==ry);
}

int main(void){
	register int i,j;
	
	//f>>n>>op;
	fscanf(f,"%d %d",&n,&op);
	memset(r,-1,4*n+8);
	for(;op>0;op--){
		//f>>t>>x>>y;
		fscanf(f,"%d %d %d",&t,&x,&y);
		if(t==1){
			upgrade(x,y);
			continue;
		}
		if(querry(x,y)){
			//g<<"DA"<<"\n";
			fprintf(g,"DA\n");
			continue;
		}
		//g<<"NU"<<"\n";
		fprintf(g,"NU\n");
	}
	return 0;
}