Cod sursa(job #599505)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 28 iunie 2011 22:49:25
Problema Heapuri Scor 10
Compilator fpc Status done
Runda Arhiva educationala Marime 1.98 kb
const   fin = 'heapuri.in'; fout = 'heapuri.out';

type
        heap = array[1..200 * 1000] of longword;
var
        h ,pos ,a : heap;

procedure swap(var a ,b : longword);
var
        c : longword;
begin
        c := a; a := b; b := c;
end;

procedure insert(var n : longword; x : longword; var r : longword);
var
        t, f : longword;
begin
        r := r + 1;
        n := n + 1;
        h[n] := x;
        a[r] := n;
        pos[n] := n;
        f := n;
        t := f div 2;
        while (t > 0) and (h[t] > h[f]) do
        begin
                swap( h[t], h[f] );
                swap( a[t], a[f] );
                pos[t] := f;
                pos[n] := t;
                f := t;
                t := f div 2;
        end;
end;

procedure delete(var n : longword; x : longword);
var
        t ,f : longword;
begin
        h[pos[x]] := h[n];
        pos[a[n]] := pos[x];
        n := n - 1;
        t := pos[x];
        f := 2 * t;
        if (f + 1 <= n) and (h[f + 1] < h[f]) then f := f + 1;
        while (f <= n) and (h[f] < h[t]) do
        begin
                swap( h[t] , h[f] );
                swap( a[t] , a[f] );
                pos[f] := t;
                pos[x] := f;
                t := f;
                f := 2 * t;
                if (f + 1 <= n) and (h[f + 1] < h[f]) then f := f + 1;
        end;
end;

procedure main();
var
        n ,m ,i ,x ,r : longword;
        cod : byte;
begin
        assign( input, fin ); reset( input );
        assign( output, fout ); rewrite( output );

        readln( m );
        n := 0; r := 0;
        for i := 1 to m do
        begin
                read( cod );
                if (cod = 3) then write( h[1], #10 ) else
                begin
                        read( x );
                        if (cod = 1) then insert( n , x , r ) else
                        if (cod = 2) then delete( n , x );
                end;
        end;
end;

begin
        main();
end.