Pagini recente » Clasament pregatire_oni_1 | Profil Ovidiu-Antonio | Cod sursa (job #846594) | Cod sursa (job #3174743) | Cod sursa (job #184539)
Cod sursa(job #184539)
#include <stdio.h>
#define MAX 110001
FILE *f,*g;
long n,m,i,j,sum[MAX], a[MAX],ratia,ls,ld,mijloc,step;
long k,l;
long calculeaza(long x, long ratia)
{
long contor=0,i;
for(i=a[x];i<=l;i+=ratia) contor++;
return contor;
}
void precalculeaza(void)
{
long i,j;
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
sum[i]=sum[i]+/*calculeaza(j,m);*/(l-a[j])/m+1;
}
}
int main()
{
f=fopen("progresii.in","r");
g=fopen("progresii.out","w");
fscanf(f,"%ld %ld %ld %ld\n",&n,&m,&k,&l);
for(i=1;i<=n;i++) fscanf(f,"%ld\n",&a[i]);
precalculeaza();
for(j=1;j<=n;j++)
{
/* for (step = 1; step < m; step <<= 1);
for (i = 0; step; step >>= 1)
if (i + step < m && (l-a[j])/step+1+sum[j]>=k)
i += step;
ratia=i;*/
i=j;
ls=1;
ld=m;
while(ls!=ld)
{
mijloc=(ls+ld)/2;
if((l-a[i])/mijloc+1/*calculeaza(i,mijloc)*/+sum[i]>k)
ls=mijloc+1;
else
ld=mijloc;
}
ratia=ls;
k=k-/*calculeaza(i, ratia); */(l-a[j])/ratia-1;
fprintf(g,"%ld\n",ratia);
}
fclose(f); fclose(g);
return 0;
}