Cod sursa(job #1779528)

Utilizator silkMarin Dragos silk Data 15 octombrie 2016 13:39:30
Problema Progresii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#define NMax 100000
#define DIM 10000
#define ll long long
char buff[DIM];
int poz;

int p[NMax+1];
int v[NMax+1];

void citeste(int& numar)
{
    numar = 0;
    while(buff[poz]<'0'||buff[poz]>'9')
    if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;

    while(buff[poz]>='0'&&buff[poz]<='9')
    {
        numar = numar * 10 + buff[poz] - '0';
        if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
    }
}

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

    int i,N,M,f;
    ll K,L,all=0,st,dr,mid;

    scanf("%d %d %lld %lld",&N,&M,&K,&L);
    for(i = 1; i <= N; ++i)
    {
        citeste(p[i]);
        if( p[i] > L ) v[i] = 1;
        else
        {
            all = all + (L-p[i])/M;
            --K;
            v[i] = M;
            if( all > K ) { printf("-1\n"); return 0; }
        }
    }

    for(i = 1; i <= N; ++i)
    if( p[i] <= L )
    {
        all = all - (L-p[i])/M;

        for(st = 1, dr = M; st <= dr;)
        {
            mid = (st+dr)>>1;
            if( all + (L-p[i])/mid <= K ) { f = mid; dr = mid-1; }
            else st = mid+1;
        }

        v[i] = f;
        all = all + (L-p[i])/f;
    }

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



return 0;
}