Cod sursa(job #253710)

Utilizator savimSerban Andrei Stan savim Data 6 februarie 2009 11:39:13
Problema Caramizi Scor 60
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_N 200010
#define MAX_L 2000010

int n, m, i, j, st, dr, mid, poz, ind, fin;
int a[MAX_N], v[MAX_L];
long long val[MAX_L], sum, nr, k, sol;

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", &a[i]);
	sort(a + 1, a + n + 1);
		
	a[0] = 1; a[n + 1] = 2147000000;
	for (i = 0; i <= n; i++) {
		if (i) sum += a[i];
		k = val[i - 1]; poz = 1;
		for (j = a[i]; j < a[i + 1]; j++) {
			nr = sum - sum % j + (n - i) * j;
			if (nr > k) { k = nr; poz = j;}
			
			v[j] = poz; val[j] = k;
			if (val[j - 1] > val[j]) {
				val[j] = val[j - 1];
				v[j] = v[j - 1];
			}
			
			if (i == n && val[j] == sum) {
				fin = 1;
				ind = j;
				break;
			}
		}
		if (fin) break;
	}
	
	for (i = 1; i <= m; i++) {
		scanf("%lld", &k);
		
		if (k > ind) k = ind;
		printf("%lld\n", val[k]);
	}
	
	return 0;
}