Cod sursa(job #164247)

Utilizator vlad.maneaVlad Manea vlad.manea Data 23 martie 2008 20:00:00
Problema Progresii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#define nmax 100005

unsigned long long N, M, K, L, ok;

unsigned long long P[nmax], consum[nmax], V[nmax];

void read()
{
	unsigned long long i;

	freopen("progresii.in", "r", stdin);

	scanf("%llu%llu%llu%llu", &N, &M, &K, &L);

	for (i = 1; i <= N; ++i)
		scanf("%llu", &P[i]);
}

void binary (unsigned long long i, unsigned long long l, unsigned long long r)
{
	if (l > r)
		return;

	unsigned long long m = (l+r)>>1;

	if (consum[i+1] + (L-P[i]) / m + 1 <= K)
	{
		ok = m;
		binary(i, l, m-1);
	}
	else
		binary(i, m+1, r);
}

void solve()
{
	unsigned long long i;

	// cat consuma playerii i, i+1, ... N alergand cu viteza maxima M?
	for (i = N; i >= 1; i--)
		consum[i] = consum[i+1] + (L-P[i]) / M + 1;

	for (i = ok = 1; i <= N && ok; ++i)
	{
		ok = 0;
		binary(i, 1, M);
		if (ok)
		{
			V[i] = ok;
			K -= (L-P[i]) / V[i] + 1;
		}
	}
}

void write()
{
	unsigned long long i;

	freopen("progresii.out", "w", stdout);

	if (ok)
		for (i = 1; i <= N; ++i)
			printf("%llu\n", V[i]);
	else
		printf("-1\n");
}

int main()
{
	read();

	solve();

	write();

	return 0;
}