Pagini recente » Cod sursa (job #2084622) | Cod sursa (job #52122) | Cod sursa (job #571165) | Cod sursa (job #2846202) | Cod sursa (job #125081)
Cod sursa(job #125081)
#include<stdio.h>
long v[300005],ind[300005],par[300005],indpart[300005];
long n,d;
void read()
{
scanf("%ld%ld",&n,&d);
long i;
i=1;
while (i<=n)
{
scanf("%ld",&v[i]);
ind[i]=i;
i++;
}
}
long part(long st,long dr)
{
long aux;
long i,j;
long p;
p=v[(st+dr)/2];
i=st-1;
j=dr+1;
while (1)
{
do {i++;} while(v[i]<p);
do {j--;} while(v[j]>p);
if (i<j)
{
aux=v[i];
v[i]=v[j];
v[j]=aux;
aux=ind[i];
ind[i]=ind[j];
ind[j]=aux;
}
else return j;
}
}
void quicks(long st,long dr)
{
long p;
if (st<dr)
{
p=part(st,dr);
quicks(st,p);
quicks(p+1,dr);
}
}
void partitii()
{
long i,j,pmax=1,k,min=v[1],pmin=1,in=1;
i=2;
par[1]=v[1];
indpart[ind[1]]=1;
while (i<=n)
{
j=1;
k=1;
if (v[i]-min>=d)
{
par[pmin]=v[i];
indpart[ind[i]]=pmin;
min=v[in+1];
in++;
pmin=indpart[ind[in]];
}
else {pmax++;
par[pmax]=v[i];
indpart[ind[i]]=pmax;
}
i++;
}
printf("%ld\n",pmax);
i=1;
while (i<=n)
{
printf("%ld\n",indpart[i++]);
}
}
int main()
{
freopen("partitie.in","r",stdin);
freopen("partitie.out","w",stdout);
read();
quicks(1,n);
partitii();
fcloseall();
return 0;
}