Cod sursa(job #486830)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 22 septembrie 2010 21:03:32
Problema Progresii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.77 kb
#include <stdio.h>

long long n, m, k, l, sol, s;
long long v[100002];

void cautare (long long i, long long st, long long dr)
{
	long long m;
	
	while (st <= dr)
	{
		m = (st + dr) >> 1;
		if (s + v[i] / m + 1 <= k)
		{
			dr = m - 1;
			sol = m;
		}
		else
			st = m + 1;
	}
}

int main ()
{
	freopen ("progresii.in", "r", stdin);
	freopen ("progresii.out", "w", stdout);
	
	scanf ("%lld %lld %lld %lld", &n, &m, &k, &l);
	
	long long i;
	
	for (i = 1; i <= n; i ++)
	{
		scanf ("%lld", &v[i]);
		v[i] = l - v[i];
		
		s += v[i] / m + 1;
	}
	
	if (s > k)
	{
		printf ("-1\n");
		return 0;
	}
	
	for (i = 1; i <= n; i ++)
	{
		s -= v[i] / m + 1;
		cautare (i, 1, m);
		s += v[i] / sol + 1;
		
		printf ("%lld\n", sol);
	}
	return 0;
}