Cod sursa(job #390362)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 3 februarie 2010 16:59:51
Problema Caramizi Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.83 kb
#include <cstdio>
#define CMAX 1000010
#include <algorithm>
using namespace std;

long long S[CMAX], V[CMAX];
int N, M;

int main()
{
	freopen("caramizi.in","r",stdin);
	freopen("caramizi.out","w",stdout);
	scanf("%d %d",&N,&M);
	int c, i, maxc=0;
	for (i=1; i<=N; i++) 
	{
		scanf("%d",&c);
		maxc=max(maxc,c);
		V[c]++;
	}
	for (i=1; i<=maxc; i++) S[i]=S[i-1]+V[i-1]*(i-1);
	long long sum=S[maxc]+V[maxc]*maxc;
	for (i=maxc; i>0; i--) V[i]+=V[i+1];
	for (i=1; i<=maxc; i++) 
	{
		S[i]=(S[i]+V[i]*i)/i *i;
		S[i]=max(S[i], S[i-1]);
	}
	N=sum/maxc;
	V[N+1]=0;
	for (i=N; i>0; i--) 
	{
		V[i]=sum/i*i;
		V[i]=max(V[i],V[i+1]);
	}
	while (M--)
	{
		scanf("%d",&c);
		if (c<=maxc) printf("%lld\n",S[c]); else 
			if (sum/(sum/c)!=c) printf("%lld\n",max(sum/c*c, V[sum/c+1])); else printf("%lld\n",V[sum/c]);
	}
}