Cod sursa(job #270674)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 4 martie 2009 13:08:51
Problema Caramizi Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <algorithm>
#define LL long long
using namespace std;
int n,m,p,a[200005],Q[200005],ind[200005];
long long s[200005],SS,rez[1000005],sol[200005];

int main(){
  freopen("caramizi.in","r",stdin); freopen("caramizi.out","w",stdout);
  scanf("%d %d\n",&n,&m);
  int i,j,x,p,low,high,mid;
  for (i=1;i<=n;++i)scanf("%d",&a[i]);
  for (i=1;i<=m;++i)scanf("%d",&Q[i]);

  sort(a+1,a+n+1);
  for (i=1;i<=n;++i)s[i]=(LL)s[i-1]+a[i];
  for (i=1,p=0;i<=n;++i)if (a[i]!=a[i+1])ind[++p]=i;
  for (j=1;j<=1000000;++j){
    low=1;high=p+1;x=j;
    while (low<high){
      mid=(high+low)>>1;
      if (x<=a[ind[mid]])high=mid; else low=mid+1;
    }
    if (a[ind[low]]==x)SS=s[ind[low]]+(LL)x*(n-ind[low]);
    else SS=s[ind[low-1]]+(LL)x*(n-ind[low-1]);
    rez[j]=(LL)(SS/x)*x;if (rez[j-1]>rez[j])rez[j]=rez[j-1];
  }
  for (i=s[n]/a[n]; i ;--i){
    sol[i]=(LL)(s[n]/i)*i;
    if (sol[i+1]>sol[i])sol[i]=sol[i+1];
  }
  for (i=1;i<=m;++i)
    if (Q[i]<=1000000)printf("%lld\n",rez[Q[i]]);
    else printf("%lld\n",sol[(LL)s[n]/Q[i]]);
return 0;
}