Cod sursa(job #1413025)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 1 aprilie 2015 18:10:17
Problema Progresii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>
#include <cctype>

#define Nmax 100010
#define Bsize 65536

using namespace std;

int n , m , p , i;
int A[Nmax];

long long K , L , ramas , suc;

int Binary_Search(int start , long long &x)
{
    int st = 1; int dr = m; int sol = 0;

    long long used = (L - 1LL * start + 1) / (1LL * m);

    for (int mij = (st + dr) >> 1; st <= dr; mij = (st + dr) >> 1)
    {
        suc = (L - 1LL * start + 1) / (1LL * mij);

        if (x + used >= suc) sol = mij , dr = mij - 1;
        else st = mij + 1;
    }

    if (sol);
    else sol = dr;

    suc = (L - 1LL * start + 1) / (1LL * sol);
    x += used; x -= suc;

    return sol;
}

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

    scanf("%d %d %lld %lld", &n, &m, &K, &L);

    ramas = K;

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

        suc = (L - 1LL * A[i] + 1) / (1LL * m);

        ramas -= 1LL * suc;

        if (ramas < 0)
        {
            printf("-1\n");
            return 0;
        }
    }

    for (i = 1; i <= n; ++i)
        printf("%d\n", Binary_Search(A[i] , ramas));

    return 0;
}