Cod sursa(job #294438)

Utilizator katakunaCazacu Alexandru katakuna Data 2 aprilie 2009 15:43:11
Problema Caramizi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
using namespace std;
#include <cstdio>
#include <algorithm>
#define Nmax 1000011

int n, m, c[Nmax], l[Nmax], cmax, i, nr[Nmax], lmax;
long long sol[Nmax], s[Nmax], S;

long long calc(long long x){
	return ( s[x] + x * ((long long)n - (long long)nr[x]) ) / x * x;
}

int main(){

	FILE *f = fopen("caramizi.in", "r");
	FILE *g = fopen("caramizi.out", "w");
	
	fscanf(f,"%d %d",&n, &m);
	for( i = 1; i <= n; i++){
		fscanf(f,"%d",&c[i]);
		s[c[i] + 1]+=(long long)c[i];
		nr[ c[i] + 1 ]++;
		
		if( c[i] > cmax ) cmax = c[i];
	}

	for(i = 1; i <= m; i++){
		fscanf(f,"%d",&l[i]);
		if( l[i] > lmax ) lmax = l[i];
	}
	
	int q = max(cmax, lmax);
	for( i = 1; i <= q + 1; i++)
		s[i]+=s[i-1], nr[i]+=nr[i-1];
	
	for(i = 1; i <= q; i++){
		sol[i] = calc(i);
		if(sol[i-1] > sol[i]) 
			sol[i] = sol[i-1];
	}
	
	S = s[cmax + 1];
	for(i = 1; i <= m; i++)
		fprintf(g,"%lld\n",sol[l[i]]);
	
	fclose(f);
	fclose(g);

	return 0;

}