Cod sursa(job #465010)

Utilizator lianaliana tucar liana Data 22 iunie 2010 21:11:40
Problema Caramizi Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.67 kb
program caramizi;
var f, g:text;
    n, m, sum, nr:int64;
    iii:longint;
    c, v:array[0..1000001] of int64;

procedure citire;
var i:longint;
  begin
    readln(f,n,m);
    for i:=1 to n do
      read(f,c[i]);
  end;

function pozitionare(i,j:longint):longint;
var x:int64;
  begin
    x:=c[i];
    while i<j do
      begin
        while (j>i) and (c[j]>=x) do
          j:=j-1;
        v[i]:=v[j];
        while (i<j) and (c[i]<=x) do
          i:=i+1;
        c[j]:=c[i];
      end;
    c[i]:=x;
    pozitionare:=i;
  end;

procedure Qsort(st,dr:longint);
var mm:longint;
  begin
    mm:=pozitionare(st,dr);
    if st<mm-1 then
      Qsort(st,mm-1);
    if mm+1<dr then
      Qsort(mm+1,dr);
  end;

procedure rezolvare;
var i, j:longint;
  begin
    c[n+1]:=c[n]+1;
    for i:=0 to n do
      begin
        sum:=sum+c[i];
        for j:=c[i] to c[i+1]-1 do
          if j<>0 then
            begin
              v[j]:=(sum div j)*j+(n-i)*j;
              if v[j-1]>v[j] then
                v[j]:=v[j-1];
            end;
      end;
  end;

procedure mai_mare;
var i, min:longint;
  begin
    min:=maxlongint;
    for i:=c[n]+1 to nr do
      if sum mod i<min then
        begin
          min:=sum mod i;
          if min=0 then
            break;
        end;
    writeln(g,sum-min);
  end;

  begin
    assign(f,'caramizi.in'); reset(f);
    assign(g,'caramizi.out'); rewrite(g);
    citire;
    Qsort(1,n);
    rezolvare;
    for iii:=1 to m do
      begin
        read(f,nr);
        if nr<=c[n] then
          writeln(g,v[nr])
         else
           mai_mare;
      end;
    close(f);
    close(g);
  end.