Cod sursa(job #258186)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 14 februarie 2009 20:20:04
Problema Caramizi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <stdio.h>
#include <math.h>
#include <algorithm>

using namespace std;

#define MAXN 200010
#define MAXX 1000010
#define ll long long

int N, M;
int NR, Q;
int A[MAXN];
ll S, V;
ll T[MAXX], T2[MAXX];

int main()
{
	freopen("caramizi.in", "r", stdin);
	freopen("caramizi.out", "w", stdout);

	int i, j, hmin;

	scanf("%d %d ", &N, &M);

	for (i = 1; i <= N; i++) scanf("%d ", &A[i]);

	sort(A+1, A+N+1);

	NR = N, S = 0;

	for (i = 1, j = 1; i <= A[N]; i++)
	{
		for (; j <= N && A[j] <= i; j++)
		{
			S += A[j];
			NR--;
		}

		T[i] = max(T[i-1], 1LL * NR*i + 1LL * (S/i) * i);
	}

	for (i = S/A[N]; i >= 1; i--) 
	{
		T2[i] = T2[i+1];
		T2[i] = max(T2[i], 1LL * i * (S/i));
	}

	for (i = 1; i <= M; i++)
	{
		scanf("%d ", &Q);

		if (Q <= A[N]) printf("%lld\n", T[Q]);
		else {
				 hmin = S / Q, V = 0;

				 if (S > 1LL * (hmin+1) * A[N]) V = T2[hmin+1]; 
				 V = max(V, 1LL * Q * hmin);

				 printf("%lld\n", max(T[A[N]], V));
			 }
	}

	return 0;
}