Cod sursa(job #1603993)

Utilizator akaprosAna Kapros akapros Data 17 februarie 2016 21:23:41
Problema Progresii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>
#define maxN 100002
#define ll long long
using namespace std;
int n, m, p[maxN], sol;
ll k, l, s;
void read()
{
    int i;
    freopen("progresii.in", "r", stdin);
    scanf("%d %d %lld %lld", &n, &m, &k, &l);
    for (i = 1; i <= n; ++ i)
    {
        scanf("%d", &p[i]);
        s = s + 1LL * ((l - p[i] + 1) / m);
    }
}
void solve()
{
    int i;
    if (s > k)
    {
        sol = -1;
        return ;
    }
}
int ok(int a, int i)
{
    if ((s - (1LL * (l - p[i] + 1) / m) + (1LL * (l - p[i] + 1)/ a)) <= k)
        return 1;
    return 0;
}
int bs(int I)
{
    int i = m, p = 1 << 30;
    while (p)
    {
        if (i - p > 0 && ok(i - p, I))
            i -= p;
        p /= 2;
    }

    return i;
}
void write()
{
    int v, i;
    freopen("progresii.out", "w", stdout);
    if (sol == -1)
        printf("-1");
    else
    {
        for (i = 1; i <= n; ++ i)
        {
            v = bs(i);
            if (k > 0)
                s -= ((l - p[i] + 1) / m);
            k -= ((l - p[i] + 1) / v);
            printf("%d\n", v);
        }
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}