Cod sursa(job #1994235)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 24 iunie 2017 13:56:31
Problema Progresii Scor 60
Compilator cpp Status done
Runda Simulare 16 Marime 1.13 kb
#include <cstdio>

using namespace std;

FILE *fin = fopen ("progresii.in", "r"), *fout = fopen ("progresii.out", "w");

const int nmax = 1e5;
long long p[nmax + 1];

int main() {
    int n, m; long long k, l;
    fscanf(fin, "%d%d%lld%lld", &n, &m, &k, &l);

    long long cmin = 0;
    for (int i = 1; i <= n; ++ i) {
        fscanf (fin, "%lld", &p[ i ]);
        p[ i ] = l - p[ i ];

        if (p[ i ] >= 0) {
            cmin += p[ i ] / m + 1;
        }
    }

    int n2;
    for (n2 = 1; n2 <= m / 2; n2 <<= 1) {
    }

    if (cmin > k) {
        fprintf(fout, "-1\n");
    } else {
        for (int i = 1; i <= n; ++ i) {
            if (p[ i ] < 0) {
                fprintf(fout, "%d\n", 1);
                continue;
            }

            cmin -= p[ i ] / m + 1;

            int ans = m;
            for (int step = n2; step > 0; step >>= 1) {
                if (ans - step > 0 && p[ i ] / (ans - step) + 1 <= k - cmin) {
                    ans -= step;
                }
            }

            fprintf(fout, "%d\n", ans);
            k -= p[ i ] / ans + 1;
        }
    }

    fclose( fin );
    fclose( fout );
    return 0;
}