Cod sursa(job #2116406)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 27 ianuarie 2018 16:28:57
Problema Progresii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <bits/stdc++.h>
using namespace std;
FILE *fin=fopen("progresii.in","r");
ofstream fout("progresii.out");
int n, m, d[100002], sol[100002];
long long k, l, sp[100002];
int bs(int poz)
{
    int st=1, dr=m, mijl;
    long long total_consum;
    while(st<=dr)
    {
        mijl=st+(dr-st)/2;
        total_consum=sp[poz+1]+(long long)d[poz]/mijl;
        if(d[poz]%mijl==0) total_consum++;
        if(total_consum<=k) dr=mijl-1;
        else st=mijl+1;
    }
    if(st>m)
        return -1;
    k-=(long long)total_consum-sp[poz+1];
    return st;
}
int main()
{
    int i, q;
    fscanf(fin, "%d%d%lld%lld", &n, &m, &k, &l);
    for(i=1; i<=n; i++)
    {
        fscanf(fin, "%d", &d[i]);
        d[i]=l-d[i];
        sp[i]=d[i]/m;
        if(d[i]%m==0) sp[i]++;
    }
    for(i=n-1; i>=1; i--)
        sp[i]+=sp[i+1];
    for(i=1; i<=n; i++)
    {
        q=bs(i);
        if(q==-1)
        {
            fout<<-1<<'\n';
            return 0;
        }
        sol[i]=q;
    }
    for(i=1; i<=n; i++)
        fout<<sol[i]<<'\n';
    return 0;
}