Cod sursa(job #253879)

Utilizator CezarMocanCezar Mocan CezarMocan Data 6 februarie 2009 13:16:55
Problema Caramizi Scor 60
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.18 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], mx[1000001], tot, sum, s, dmax;

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]);
		s += v[i];
	}
	
	nr = 1;
	for (i = 2; i * i < s; i++)
		if (s % i == 0)
			nr = i;
		
	dmax = s / nr;
	
	sort(v + 1, v + n + 1);
	
	for (i = 1; i <= m; i++) {
		scanf("%d", &q[i]);
		if (q[i] > mq)
			mq = q[i];
	}
	
	if (mq > 1000000 && dmax < mq)
		mq = dmax;
		
	
	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;
	}	

	for (i = 1; i <= mq; i++) {
		mx[i] = mx[i - 1];
		if (t[i] > mx[i])
			mx[i] = t[i];
	}
	
/*	for (i = 1; i <= mq; i++) {
		printf("%d ", t[i]);
	}
	printf("\n");*/
	
	
	for (i = 1; i <= m; i++) {
		if (mq > 1000000 && q[i] >= dmax)
			printf("%lld\n", mx[dmax]);
		else
			printf("%lld\n", mx[q[i]]);
	}
	
	return 0;
}