Pagini recente » Cod sursa (job #214172) | Cod sursa (job #425358) | Cod sursa (job #1235999) | Cod sursa (job #2646452) | Cod sursa (job #1201777)
#include <cstdio>
#include<algorithm>
#define DIM 8192
#define LL long long
using namespace std;
int n,m,pz,i,c,cmax;
LL s; // s=numarul total de caramizi
LL A[1000005]; // A[i]=frecventa lui i ca numar de caramizi
LL Nr[1000005]; // Nr[i]=numarul de caramizi de pe turnul i
LL R[1000005]; // R[i]=numarul de caramizi ce au c[j]<=i cu j=1,...,n;
LL D[1000005]; // D[i]=nr. maxim de caramizi daca construiesc i turnuri
LL H[200005]; // H[i]=numarul de caramizi daca construiesc i turnuri
char ax[DIM+16];
inline void cit(int &x) // citire parsata (mai rapida)
{ x=0;
while(ax[pz]<'0' || ax[pz]>'9')
if(++pz==DIM) fread(ax,1,DIM,stdin), pz=0;
while(ax[pz]>='0' && ax[pz]<='9')
{ x=x*10+ax[pz]-'0';
if(++pz==DIM) fread(ax,1, DIM, stdin), pz=0;
}
}
int main()
{ freopen ("caramizi.in","r",stdin); freopen ("caramizi.out","w",stdout);
cit(n); cit(m);
for(i=1;i<=n;++i) cit(c), ++A[c], cmax=max(cmax,c), s+=c;
for(i=1;i<=cmax;++i) R[i]=R[i-1]+i*A[i];
for(i=cmax;i;--i) Nr[i]=Nr[i+1]+A[i];
for(i=1;i<=cmax;++i) D[i]=max(D[i-1],R[i]/i*i+Nr[i+1]*i);
H[s/cmax+1]=D[cmax];
for(i=s/cmax;i;--i) H[i]=max(H[i+1],s/i*i);
for(i=1;i<=m;++i)
{ cit(c);
if(c<=cmax) printf("%lld\n",D[c]); else printf("%lld\n",max(s/c*c,H[s/c+1]));
}
return 0;
}