Cod sursa(job #270671)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 4 martie 2009 13:02:08
Problema Caramizi Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <algorithm>
#define GET_BUF fread(b,sizeof(char),8192,stdin)
#define BL 8192
using namespace std;
int n,m,i,j,p,q,a[200005],Q[200005],ind[200005];
char b[BL];
long long s[200005],SS,rez[1000005],sol[200005];

void read(bool k,int n){
 int x;
 for (i=1;i<=n;++i){
  x=0; if (j==BL){q=GET_BUF;j=0;}
  while ( b[j]>='0' && b[j]<='9' && j<q ){
   x=x*10+b[j]-'0';
   j++;if (j==BL){q=GET_BUF;j=0;}
  }
  j++;
  if (j==BL){q=GET_BUF;j=0;}
  if (!k)a[i]=x;else Q[i]=x;
 }
}

int main(){
  freopen("caramizi.in","r",stdin); freopen("caramizi.out","w",stdout);
  scanf("%d %d\n",&n,&m);
  int i,j,x,low,high,mid;
  //q=GET_BUF; read(0,n); read(1,m);
  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]=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]]+x*(n-ind[low]);
    else SS=s[ind[low-1]]+x*(n-ind[low-1]);
    rez[j]=(SS/x)*x;if (rez[j-1]>rez[j])rez[j]=rez[j-1];
  }
  for (i=s[n]/a[n]; i ;--i){
    sol[i]=(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[s[n]/Q[i]+1]);
return 0;
}