Cod sursa(job #1779522)

Utilizator silkMarin Dragos silk Data 15 octombrie 2016 13:37:14
Problema Progresii Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 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;
    }
}

void scrie(int x)
{
    char aux,i,j,t=-1,a[16];
    while(x) { a[++t] = x%10+'0'; x/=10; }
    a[t+1] = NULL;
    for(i = 0, j = t; i < j; ++i,--j)
    {
        aux = a[i];
        a[i] = a[j];
        a[j] = aux;
    }

    puts(a);
}

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) scrie(v[i]);



return 0;
}