Cod sursa(job #253964)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 6 februarie 2009 13:55:17
Problema Caramizi Scor 15
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.17 kb
#include<stdio.h>
long n,m;
long long sum;
long v[200010];//v[200010];


void read()
{
freopen("caramizi.in","r",stdin);
freopen("caramizi.out","w",stdout);
scanf("%ld%ld",&n,&m);
long i,j;
for(i=1;i<=n;i++)
  {
  scanf("%ld",&v[i]);
  sum=sum+v[i];
  }
}


long part(long st, long dr)
{
long i,j,m,pivot,aux;
m=(st+dr)>>1;
pivot=v[m];
i=st-1;
j=dr+1;
while(1)
  {
  do{++i;}while(v[i]<pivot);
  do{--j;}while(v[j]>pivot);
  if(i<j)
    {
    aux=v[i];
    v[i]=v[j];
    v[j]=aux;
    }
  else
    return j;
  }
}


void quick(long st, long dr)
{
long p;
if(st<dr)
  {
  p=part(st,dr);
  quick(st,p);
  quick(dr,p+1);
  }
}


void rez()
{
long t,li,suma,csum,max,i,j,ind;
for(t=1;t<=m;t++)
  {
  suma=0;
  max=0;
  scanf("%ld",&li);
  for(ind=n;v[ind]>li;ind--)
    {
    suma=suma+li;
    }
  for(i=ind;i>=1;i--)
    suma=suma+v[i];
  sum=suma;

  for(j=li;j>=1;j--)
    {
    csum=sum;
    csum=csum-csum%j;
    if(csum>max)
      max=csum;
    sum=sum-(n-ind);
    for(;v[ind]>(j-1);ind--)
      sum=sum-v[ind]+j-1;

    }
  printf("%ld\n",max);
  }
}


int main()
{
read();
quick(1,n);
rez();
return 0;
}