Cod sursa(job #44536)

Utilizator Bluedrop_demonPandia Gheorghe Bluedrop_demon Data 31 martie 2007 15:12:56
Problema Regiuni Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 3.43 kb
{
    Problema regiuni
}

Program regiuni;

Type ref = ^elm;
     elm = record
            x, y : Integer;
            adr : ref;
           end;

Var n, m, i, j, k, kf, a, b, c : Integer;
    l : array[1..1000] of ref;
    e, f, g : ref;
    mm, nn : real;
    vert, cod, codp : boolean;

Begin
    Assign( input, 'regiuni.in' );
    Reset( input );
        Readln( n, m );
        For i := 1 to n do
            Readln( a, b, c );
        k := 1;
        l[k] := nil;
        For i := 1 to m do
            Begin
                new( e );
                Readln( e^.x, e^.y );
                e^.adr := l[k];
                l[k] := e;
            End;
    Close( input );
    Reset( input );
    Readln( n, m );

    For i := 1 to n do
        Begin
            Readln( a, b, c );
            if b = 0 then
                Begin
                    vert := true;
                    mm := 0;
                    nn := -c/a;
                End
                else
                Begin
                    vert := false;
                    mm := -a/b;
                    nn := -c/b;
                End;
            kf := k;
            For j := 1 to kf do
                Begin
                    k := k+1;
                    l[k] := nil;
                    e := l[j];
                    Case vert of
                         true: if e^.x > nn then codp := true
                                            else codp := false;
                         false: if e^.y < mm*e^.x + nn then codp := true
                                                       else codp := false;
                    End;
                    g := e;
                    e := e^.adr;
                    while e <> nil do
                        Begin
                            Case vert of
                                true: if e^.x > nn then cod := true
                                                   else cod := false;
                                false: if e^.y < mm*e^.x + nn then cod := true
                                                              else cod := false;
                            End;
                            If cod <> codp then
                                        Begin
                                            new( f );
                                            f^.x := e^.x;
                                            f^.y := e^.y;
                                            f^.adr := l[k];
                                            l[k] := f;
                                            g^.adr := e^.adr;
                                            dispose( e );
                                            e := g^.adr;
                                        End
                                        else
                                        Begin
                                            g := e;
                                            e := e^.adr;
                                        End;
                        End;
                    if l[k] = nil then Begin k := k-1; dispose(l[k+1]); End;
                End;
        End;
    Close( input );

    Assign( output, 'regiuni.out' );
    Rewrite( output );
        Writeln( k );
    Close( output );

    For i := 1 to k do
        While l[i] <> nil do
            Begin
                e := l[i];
                l[i] := l[i]^.adr;
                dispose( e );
            End;

End.