Cod sursa(job #268387)

Utilizator CezarMocanCezar Mocan CezarMocan Data 1 martie 2009 11:03:33
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#include <algorithm>
#define maxn 200010

using namespace std;

int n, m, i, j, l, ct, mq, nr;
int v[maxn], q[maxn];
long long t[1000001], tot, sum, s, dmax, p[1000001];

int main() {
	freopen("caramizi.in", "r", stdin);
	freopen("caramizi.out", "w", stdout);
	
	scanf("%d%d", &n, &m);
	
	for (i = 1; i <= n; i++) 
		scanf("%d", &v[i]);
	
	sort(v + 1, v + n + 1);
	
	for (i = 1; i <= m; i++) 
		scanf("%d", &q[i]);
	
	mq = 1000000;
	i = 1; sum = 0;
	for (l = 1; l <= mq; l++) {
		while (v[i] < l && i <= n) {
			sum += v[i];
			i++;
		}
		ct = n - i + 1;
		tot = (1LL * l * ct) + sum;
		t[l] = tot / l;		
		t[l] *= l;
		if (t[l - 1] > t[l])
		  t[l] = t[l - 1];
	}	

    for (l = sum / v[n]; l >= 1; l--) 
        p[l] = max(sum - sum % l, p[l + 1]);
    

	for (i = 1; i <= m; i++) 
	   if (q[i] <= mq)
    		printf("%lld\n", t[q[i]]);
       else
            printf("%lld\n", p[sum / q[i] + 1]);
	
	return 0;
}