Cod sursa(job #116716)

Utilizator bogdan88Bogdan Popescu bogdan88 Data 19 decembrie 2007 13:16:36
Problema Zeap Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.12 kb
var fi,fo:text;
    s:string[15];
    zeap:array[1..200000]of longint;
    ins:array[1..1000000000]of byte;
    poz:array[1..200000000]of longint;
    ct:longint;
function solv(var nr:longint; s:string):string[3];
var numar:string[10];
    i:byte;
    e:integer;
begin
  if s[1]='M' then solv:=s
    else
      begin
        solv:=s[1];
        numar:='';
        for i:=3 to length(s) do
          numar:=numar+s[i];
        val(numar,nr,e);
      end;
end;
procedure insereaza(vl:longint);
begin
  if ins[vl]<>1 then
    begin
      inc(ct);
      zeap[ct]:=vl;
      ins[vl]:=1;
      poz[vl]:=ct;
    end;
end;
procedure sterge(vl:longint);
begin
  if poz[vl]=0 then writeln(fo,'-1')
    else
      begin
        zeap[poz[vl]]:=zeap[ct];
        dec(ct);
      end;
end;
function cauta(vl:longint):integer;
begin
  if ins[vl]=0 then cauta:=0
               else cauta:=1;
end;
function max:longint;
var maxi,min,i:longint;
begin
  if ct<2 then max:=-1
    else
      begin
        maxi:=-maxint;
        min:=maxint;
        for i:=1 to ct do
          begin
            if zeap[i]>maxi then maxi:=zeap[i];
            if zeap[i]<min then min:=zeap[i];
          end;
        max:=maxi-min;
      end;
end;
function min:longint;
var min1,min2,i:longint;
begin
  if ct<2 then min:=-1
    else
      begin
        min1:=maxint;
        min2:=maxint;
        for i:=1 to ct do
          if min1>zeap[i] then min1:=zeap[i]
            else
              if min2>zeap[i] then min2:=zeap[i];
        min:=min2-min1;
      end;
end;
procedure Read_fi;
var op:string[3];
    nr:longint;
begin
  while not eof(fi) do
    begin
      readln(fi,s);
      op:=solv(nr,s);
      if op='I' then insereaza(nr)
        else
          if op='S' then sterge(nr)
            else
              if op='C' then writeln(fo,cauta(nr))
                else
                  if op='MAX' then writeln(fo,max)
                     else writeln(fo,min);
    end;
end;
begin
  assign(fi,'zeap.in'); reset(fi);
  assign(fo,'zeap.out'); rewrite(fo);
  ct:=0;
  Read_fi;
  close(fi);
  close(fo);
end.