Cod sursa(job #598991)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 27 iunie 2011 18:20:21
Problema Paduri de multimi disjuncte Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.69 kb
program _disjoint;
type
        _struct = ^_dyn;
        _dyn = record
                urm : _struct;
                x : longword;
                end;
        _vector1 = array[1..100000] of longword;
        _vector2 = array[1..100000] of _struct;
var
        u ,h : _vector1;
        l : _vector2;
        n : longword;

procedure _init;
var
        i : longword;
begin
        for i := 1 to n do
        begin
                u[i] := i;
                h[i] := 1;
                new(l[i]);
                l[i]^.x := i;
                l[i]^.urm := nil;
        end;
end;

procedure _put(x ,y : longword);
var
        p : _struct;
begin
        h[y] := h[y] + h[x];
        while (h[x] > 0) do
        begin
                h[x] := h[x] - 1;
                p := l[x];
                l[x] := l[x]^.urm;
                p^.urm := l[y];
                l[y] := p;
                u[p^.x] := u[y];
        end;
end;

procedure _main;
var
        f ,f0 : text;
        i ,m ,x ,y : longword;
        cod : byte;
begin
        assign(f,'disjount.in'); reset(f);
        assign(f0,'disjount.out'); rewrite(f0);
        readln(f, n, m);
        _init;
        for i := 1 to m do
        begin
                readln(f, cod, x, y);
                if cod = 1 then
                begin
                        if u[x] <> u[y] then
                        if h[x] < h[y] then _put(x, y) else _put(y, x);
                end else
                begin
                        if u[x] = u[y] then write(f0,'DA',#10) else
                        write(f0,'NU',#10);
                end;
        end;
        close(f);
        close(f0);
end;

begin
_main;
end.