Cod sursa(job #395169)

Utilizator mimarcelMoldovan Marcel mimarcel Data 12 februarie 2010 12:36:38
Problema Hashuri Scor 70
Compilator fpc Status done
Runda Arhiva educationala Marime 1.56 kb
const maxmemdisp=16384*1024{bytes};
      maxmemnumere=1000000*sizeof(longint){bytes};
type plista=^lista;
     lista=record
           info:longint;
           urm:plista;
           end;
const m=(maxmemdisp-maxmemnumere)div sizeof(plista)-1;
type  hash=array[0..m]of plista;
var n,i,x:longint;
    op:byte;
    h:hash;


procedure inithash(var h:hash;m:longint);
var i:longint;
begin
for i:=1 to m do h[i]:=nil;
end;

procedure adaug(var h:hash;var x:longint);
var k:plista;
begin
k:=h[x mod m];
while k<>nil do if k^.info<>x then k:=k^.urm
                              else break;
if k=nil then
  begin
  new(k);
  k^.info:=x;
  k^.urm:=h[x mod m];
  h[x mod m]:=k;
  end;
end;

procedure sterge(var h:hash;var x:longint);
var k,l:plista;
begin
k:=h[x mod m];
if k=nil then exit;
if k^.info=x then
  begin
  h[x mod m]:=h[x mod m]^.urm;
  dispose(k);
  end
             else
  begin
  while(k^.urm<>nil)and(k^.urm^.info<>x)do k:=k^.urm;
  if k^.urm<>nil then
    begin
    l:=k^.urm;
    k^.urm:=l^.urm;
    dispose(l);
    end;
  end;
end;

procedure cautare(var h:hash;var x:longint);
var k:plista;
begin
k:=h[x mod m];
while(k<>nil)and(k^.info<>x)do k:=k^.urm;
if k=nil then writeln('0')
         else writeln('1');
end;

begin
assign(input,'hashuri.in');
assign(output,'hashuri.out');
rewrite(output);
reset(input);
readln(n);
inithash(h,m);
for i:=1 to n do
  begin
  readln(op,x);
  case op of
    1:adaug(h,x);
    2:sterge(h,x);
    3:cautare(h,x);
    end;
  end;
close(output);
close(input);
end.