Cod sursa(job #1200487)

Utilizator enedumitruene dumitru enedumitru Data 22 iunie 2014 16:58:30
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <cstdio>
#include<algorithm>
#define ll long long
#define DIM 8192 
using namespace std;
ll s[1000010],v[1000010];
int n,m,pz,i,maxc,c;
char ax[DIM+16];
inline void cit(int &x)
{	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); maxc=max(maxc,c); v[c]++;}
	for(i=1;i<=maxc;i++) s[i]=s[i-1]+v[i-1]*(i-1);
	ll 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]=s[maxc];
	for(i=n;i>0;i--) {v[i]=sum/i*i; v[i]=max(v[i],v[i+1]);}
	while(m--)
	{	cit(c);
		if(c<=maxc) printf("%lld\n",s[c]); 
		else printf("%lld\n",max(sum/c*c,v[sum/c+1]));
	}
	return 0;
}