Cod sursa(job #141140)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 22 februarie 2008 19:40:38
Problema Lupul Urias si Rau Scor 8
Compilator fpc Status done
Runda Arhiva de probleme Marime 2 kb
program lupul_rau;
type vector=array[1..100000]of int64;
var f,g:text;
    a,b:vector;
    v:array[1..100000]of 0..1;
    ok,t,i,n,k,o,x,l,p:longint;
    s:int64;
function poz(li,ls:longint):longint;
var i,j,modi,modj,m:longint;
man:int64;
begin
i:=li;
j:=ls;
modi:=0;
modj:=-1;
while (i<=j)do
  begin
    if (b[i]<b[j])then
      begin
        man:=a[i];
        a[i]:=a[j];
        a[j]:=man;
        man:=b[i];
        b[i]:=b[j];
        b[j]:=man;
        m:=modi;
        modi:=-modj;
        modj:=-m;
      end;
    i:=i+modi;
    j:=j+modj;
  end;
poz:=i;
end;

procedure quick(li,ls:longint);
begin
if (li<ls)then
  begin
    k:=poz(li,ls);
    quick(li,k-1);
    quick(k+1,ls);
  end;
end;

function poz2(li,ls:longint):longint;
var i,j,modi,modj,m:longint;
man:int64;
begin
i:=li;
j:=ls;
modi:=0;
modj:=-1;
while (i<=j)do
  begin
    if (a[i]<a[j])then
      begin
        man:=a[i];
        a[i]:=a[j];
        a[j]:=man;
        man:=b[i];
        b[i]:=b[j];
        b[j]:=man;
        m:=modi;
        modi:=-modj;
        modj:=-m;
      end;
    i:=i+modi;
    j:=j+modj;
  end;
poz2:=i;
end;

procedure quick2(li,ls:longint);
begin
if (li<ls)then
  begin
    o:=poz2(li,ls);
    quick(li,o-1);
    quick(o+1,ls);
  end;
end;

begin
assign(f,'lupu.in');
assign(g,'lupu.out');
reset(f);
rewrite(g);
read(f,n,x,l);
for i:=1 to n do
  read(f,a[i],b[i]);
quick(1,n);
i:=1;
while (i<n)do
  begin
    p:=i;
    while (b[i]=b[i+1])do
      inc(i);
    if (i>p)then
      quick2(p,i);
    inc(i);
  end;
t:=1;
s:=0;
for i:=1 to n do
  if (a[i]>x)then v[i]:=1 else v[i]:=0;
while true do
  begin
    ok:=0;
    for i:=t to n do
      if (v[i]=0)then
        begin
          ok:=1;
          break;
        end;
    if (ok=0)then break;
    s:=s+b[i];
    t:=i+1;
    for i:=t to n do
      begin
        a[i]:=a[i]+l;
        if (a[i]>x)then v[i]:=1;
      end;
  end;
write(g,s);
close(f);
close(g);
end.