Cod sursa(job #253973)

Utilizator ProtomanAndrei Purice Protoman Data 6 februarie 2009 13:57:21
Problema Caramizi Scor 80
Compilator cpp Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.17 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;
ll vctElem[200010], Q[200010];
ll sumaTot, qMax;
ll vctSol[MAX];

ll maxll(ll x, ll y)
{
	if (x > y)
		return x;
	return y;
}

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("%lld", &vctElem[i]);

		sumaTot += vctElem[i];
	}

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

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

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

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

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

		for (int i = 1; i <= LMAX; i++)
			vctSol[i] = maxll(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;
}