Cod sursa(job #6339)

Utilizator hitmannCiocas Radu hitmann Data 18 ianuarie 2007 22:37:53
Problema Zeap Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.36 kb
program zeap1;
type pnod=^nod;
     nod=record
         i:longint;
         urm:pnod;
         end;

var v:array[1..300000]of boolean;
    f,g:Text;
    n,k,max:longint;
    p,q,r:pnod;
    c:char;
begin
assign(f,'zeap.in'); reset(f);
assign(g,'zeap.out'); rewrite(g);
new(p);
max:=-1;
while not eof(f) do
begin
read(f,c);
case c of
'I':
 begin
readln(f,k);
if
max<k then max:=k;
 if not v[k] then
    begin
    if n=0 then
                begin
                new(p);
                p^.i:=k;
                p^.urm:=nil;
                end
           else
            begin
            q:=p;
            while q^.urm^.i<k do q:=q^.urm;
            new(r);
            if k<q^.i then
                      begin
                      r^.i:=q^.i;
                      r^.urm:=q^.urm;
                      q^.i:=k;
                      q^.urm:=r;
                      end
                      else
                       begin
                       r^.urm:=q^.urm;
                       r^.i:=k;
                       q^.urm:=r;
                       end;
            end;
     v[k]:=true;
     inc(n);
     end;
  end;
 'S':
  begin
  read(f,k);

      if v[k] then
              begin
              q:=p;
              dec(n); v[k]:=false;
              if p^.i=k then
                        begin
                        p:=p^.urm;
                        if n>0 then max:=p^.i
                               else max:=-1;
                        dispose(q);
                        end
                        else
                begin
              while q^.urm^.i<>k do q:=q^.urm;
              r:=q^.urm;
              if q^.urm^.i=max then
                             if q^.urm^.urm<> nil then max := q^.urm^.urm^.i
                                                  else max:=q^.i;
              q^.urm:=q^.urm^.urm;
              dispose(r);
                end
              end
              else writeln(f,-1);
  end;
'C':
 begin
 readln(f,k);
 if v[k] then writeln(g,1)
         else writeln(g,0);
 end;
'M':
 begin
 readln(f,c);
 if c='A' then

        if n>1 then writeln(g,abs(max-p^.i))
               else writeln(g,-1)
          else
           if n>1 then writeln(g,abs(p^.i-p^.urm^.i))
                  else writeln(g,-1);
 end;
end;
end;
close(g);
close(f);
end.