Cod sursa(job #306661)

Utilizator mlazariLazari Mihai mlazari Data 21 aprilie 2009 19:27:20
Problema Paduri de multimi disjuncte Scor 100
Compilator fpc Status done
Runda Arhiva educationala Marime 1.28 kb
Program Disjoint;
var intrare,iesire : text;
    t,h : array[1..100000] of longint;
    n,m : longint;

procedure deschideFisiere;
begin
  assign(intrare,'disjoint.in');
  reset(intrare);
  assign(iesire,'disjoint.out');
  rewrite(iesire);
end;

function radMultime(k : longint) : longint;
var r,i,j : longint;
begin
  r:=k;
  while t[r]>0 do r:=t[r];
  i:=k;
  while t[i]>0 do begin
    j:=t[i];
    t[i]:=r;
    i:=j;
  end;
  radMultime:=r;
end;

procedure reuneste(k1,k2 : longint);
var r1,r2 : longint;
begin
  r1:=radMultime(k1);
  r2:=radMultime(k2);
  if h[r1]=h[r2] then begin
    t[r2]:=r1;
    h[r1]:=h[r1]+1;
  end
  else
   if h[r2]<h[r1] then t[r2]:=r1
   else t[r1]:=r2;
end;

function raspuns(k1,k2 : longint) : string;
begin
  if radMultime(k1)=radMultime(k2) then raspuns:='DA'
  else raspuns:='NU';
end;

procedure proceseaza;
var i,x,y : longint;
    cod : byte;
begin
  readln(intrare,n,m);
  for i:=1 to n do begin
    t[i]:=0;
    h[i]:=0;
  end;
  for i:=1 to m do begin
    readln(intrare,cod,x,y);
    if cod=1 then reuneste(x,y)
    else writeln(iesire,raspuns(x,y));
  end;
end;

procedure inchideFisiere;
begin
  close(intrare);
  close(iesire);
end;

begin
  deschideFisiere;
  proceseaza;
  inchideFisiere;
end.