Cod sursa(job #253854)

Utilizator ProtomanAndrei Purice Protoman Data 6 februarie 2009 12:58:45
Problema Caramizi Scor 80
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.1 kb
// using ...hibride:)

#include <stdio.h>
#include <algorithm>

#define ll long long
#define MAX 1024 * 1024
#define LMAX 1000010

using namespace std;

int n, m, qMax;
int vctElem[200010], Q[200010];
ll sumaTot;
ll vctSol[MAX];

int main()
{
	freopen("caramizi.in", "r", stdin);
	freopen("caramizi.out", "w", stdout);
	
	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &vctElem[i]);

		sumaTot += (ll) vctElem[i];
	}

	for (int i = 1; i <= m; i++)
	{
		scanf("%d", &Q[i]);
		qMax = max(qMax, Q[i]);
	}

	sort(vctElem + 1, vctElem + 1 + n);

	if (qMax <= LMAX)
	{
		// pnm... pentru alea 80 de puncte sper:)
		int st = n;

		for (ll i = LMAX; i; i--)
		{
			for (; vctElem[st] > i && st; st--);

			sumaTot -= (ll) n - st;
			ll x = sumaTot / i;
			vctSol[i] = x * i;
		}

		for (int i = 1; i <= LMAX; i++)
			vctSol[i] = max(vctSol[i - 1], vctSol[i]);

		for (int i = 1; i <= m; i++)
			printf("%lld\n", vctSol[Q[i]]);
	}
	else
	{
		// pnm sa speram ca merge si asta pt 20 de puncte...
	}

	fclose(stdin);
	fclose(stdout);
	return 0;
}