Cod sursa(job #163553)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 22 martie 2008 14:46:36
Problema Progresii Scor 0
Compilator fpc Status done
Runda preONI 2008, Runda Finala, Clasa a 9-a Marime 2.58 kb
program progresii;
var f,g:text;
        n,m,total,update,k:int64;
        l:int64;
        speed:array [1..100001] of int64;
        p:array[1..100001] of int64;


procedure iofile;
var i:longint;
begin
        assign(f,'progresii.in');reset(f);
        assign(g,'progresii.out');rewrite(g);
        readln(f,n,m,k,l);
        total:=0;
        for i:=1 to n do
                begin
                read(f,p[i]);
                        speed[i]:=1;
                        total:=total+(l-p[i]) +1;
                end;
        close(f);
end;

function decilitri (length,speed:int64):int64;
begin
        decilitri:=(length div speed) +1;
end;

procedure cbin(p,u,leng,target:int64);
var mij,sum:int64;
begin
        if p<=u then
                begin
                        mij:=(p+u) div 2;
                        sum:=decilitri(leng,mij);
                        if sum<=target then
                                begin
                                        update:=mij;
                                        cbin(p,mij-1,leng,target);
                                end else
                                cbin(mij+1,u,leng,target);
                end;
end;

procedure solve;
var ntotal,without:int64;
        i:longint;
begin
        for i:=n downto 1 do
                begin
                        ntotal:=total-decilitri(l-p[i],1)+decilitri(l-p[i],m);
                        if ntotal>k then
                                begin
                                        speed[i]:=m;
                                        total:=ntotal;
                                end else
                                        begin
                                                without:=total-decilitri(l-p[i],1);
                                                update:=m;
                                                cbin(1,m,l-p[i],k-without);
                                                speed[i]:=update;
                                                total:=ntotal;
                                                break;
                                        end;
                end;
        if total<=k then
                        begin
                                for i:=1 to n do
                                        writeln(g,speed[i]);
                                close(g);
                        end else
                        begin
                                writeln(g,-1);
                                close(g);
                        end;
end;



begin
        iofile;
        solve;
end.