Cod sursa(job #116752)

Utilizator bogdan88Bogdan Popescu bogdan88 Data 19 decembrie 2007 14:26:01
Problema Zeap Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.71 kb
type pelem=^elem;
     elem=record
       info:longint;
       next:pelem;
     end;
var fi,fo:text;
    lista,last:pelem;
    s:string[15];
    e,nr,ct:longint;
    numar:string[10];
    i:byte;
    c:char;
    inserat:array[1..1000000000]of char;
function maxim(first:pelem):longint;
var p:pelem;
    max,min:longint;
begin
  p:=first;
  if p^.next=nil then begin writeln(fo,'-1'); exit; end;
  max:=-maxint; min:=maxint;
  while p<>nil do
    begin
      if p^.info>max then max:=p^.info;
      if p^.info<min then min:=p^.info;
      p:=p^.next;
    end;
  maxim:=max-min;
  writeln(fo,maxim);
end;
function minim(first:pelem):longint;
var p:pelem;
    min1,min2:longint;
begin
  p:=first;
  if p^.next=nil then begin writeln(fo,'-1'); exit; end;
  min1:=maxint; min2:=maxint;
  while p<>nil do
    begin
      if p^.info<min1 then
        begin
          min2:=min1;
          min1:=p^.info; end
       else
         if p^.info<min2 then min2:=p^.info;
      p:=p^.next;
    end;
  minim:=abs(min2-min1);
  writeln(fo,minim);
end;
procedure inserare(var first:pelem; vl:longint);
var x:pelem;
begin
  if inserat[vl]='.'then exit
    else
      begin
        new(x);
        x^.info:=vl; x^.next:=nil;
        inserat[vl]:='.';
        if first=nil then
          begin
            first:=x; last:=first; exit; end;
        last^.next:=x;
        last:=x;
      end;
end;
function cauta(vl:longint):byte;
begin
  if inserat[vl]='.' then cauta:=1
     else cauta:=0;
end;
procedure sterge(var first:pelem; vl:longint);
var x,p:pelem;
begin
  if cauta(vl)=0 then begin writeln(fo,'-1'); exit; end
     else
       begin
         inserat[vl]:='a';
         if first=nil then exit;
         if first^.info=vl then
           begin
             x:=first;
             first:=first^.next;
             dispose(x);
             exit; end;
         x:=first;
         while x^.next^.info<>vl do
           x:=x^.next;
         p:=x^.next;
         x^.next:=p^.next;
         dispose(p);
       end;
end;
begin
  assign(fi,'zeap.in'); reset(fi);
  assign(fo,'zeap.out'); rewrite(fo);
  while not eof(fi) do
    begin
      readln(fi,s);
      if s='MAX' then maxim(lista)
       else
         if s='MIN' then minim(lista)
           else
             begin
               c:=s[1];
               numar:='';
               for i:=3 to length(s) do
                 numar:=numar+s[i];
               val(numar,nr,e);
               if c='I' then inserare(lista,nr)
                 else
                  if c='S' then  sterge(lista,nr)
                    else
                      writeln(fo,cauta(nr));
             end;
    end;
  close(fi);
  close(fo);
end.