Cod sursa(job #163585)

Utilizator IoannaPandele Ioana Ioanna Data 22 martie 2008 14:48:10
Problema Progresii Scor 70
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasa a 9-a Marime 1.14 kb
#include<stdio.h>
long n,m;
long long k,l; 
long long sum;
long p[100005],c[100005];

void scan()
{
	long i;
	long long nr;
    scanf("%ld%ld%lld%lld",&n,&m,&k,&l); 
	for (i=1;i<=n;i++)
	{
		scanf("%ld",&p[i]);
		nr=(l-p[i])/m+1;
		c[i]=m;
		sum=sum+nr;
	}
}

long cautbin(long st,long dr,long poz,long i)
{
	long mi;
	long long nr;
	mi=(st+dr)/2;
	if (st>dr)
		return poz;
	nr=(l-p[i])/mi+1;
	if (sum+nr<=k)
		return cautbin(st,mi-1,mi,i);
	else return cautbin(mi+1,dr,poz,i);
}

void solve()
{
long i,j,w;
long long nr;
for (i=1;i<=n;i++)
{
	nr=(l-p[i])/m+1;
	sum-=nr;
	w=cautbin(1,m,m,i);
	for (j=w;j>=1;j--)
	{
	 nr=(l-p[i])/j+1;	
	 if (sum+nr>k)
	    {
			break;
	    }
	}
	j++;
	c[i]=j;
	nr=(l-p[i])/j+1;	
	sum+=nr;
}
}

void print()
{
	long i;
	for (i=1;i<=n;i++)
		printf("%ld\n",c[i]);
}

int main()
{
	freopen("progresii.in","r",stdin);
	freopen("progresii.out","w",stdout);
	scan();
	if (sum>k)
		printf("-1\n");
	else if (sum==k)
	       	{long i;
				for (i=1;i<=n;i++)
					printf("%ld\n",m); 
			}
		  else {
		 	    solve();
				print();
		       }
		  
	return 0;
}