Cod sursa(job #162103)

Utilizator filipbFilip Cristian Buruiana filipb Data 19 martie 2008 14:41:20
Problema Progresii Scor Ascuns
Compilator cpp Status done
Runda Marime 1.16 kb
#include <stdio.h>
#include <assert.h>

#define ll long long

int N, M, P[100005], sol[100005];
ll K, X, last[100005], st;

int main(void)
{
    int i, j, l, r, m;
    
    freopen("progresii.in", "r", stdin);
    freopen("progresii.out", "w", stdout);

    scanf("%d %d %lld %lld", &N, &M, &K, &X);
    assert(1 <= N && N <= 100000);
    assert(1 <= M && M <= 2000000000);
    assert(1 <= K && K <= ((ll)1<<60) && 1 <= X && X <= ((ll)1<<60));
    
    for (i = 1; i <= N; ++i)
    {
        scanf("%d", &P[i]);
        assert(1 <= P[i] && P[i] <= 2000000000);
    }
    
    for (i = N; i; --i)    
        last[i] = last[i+1] + (X >= P[i] ? 1+(X-P[i])/M : 0);
    for (i = 1; i <= N; ++i)
    {
        for (l = 1, r = M, j = -1; l <= r; )
        {
            m = ((unsigned)l + r) / 2;
            if (st + last[i+1] + (X >= P[i] ? 1+(X-P[i])/m : 0) <= K)
                j = m, r = m-1;
            else
                l = m+1;
        }
        if (j == -1)
        {
            printf("-1\n");
            return 0;
        }
        sol[i] = j;
        st += (X >= P[i] ? 1+(X-P[i])/j : 0);
   }

   for (i = 1; i <= N; ++i)
       printf("%d\n", sol[i]);

    return 0;
}