Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 173 si 172 | Cod sursa (job #2104948) | Cod sursa (job #1456589) | Cod sursa (job #2182079) | Cod sursa (job #127928)
Cod sursa(job #127928)
#include<stdio.h>
#include<string.h>
int n,k,a[300010],b[300010],m,i,j,nr,x;
int r1[2000],r2[2000],aux[300010];
int poz(int i,int j)
{int x=0,y=-1,aux;
while(i<j){
if(a[i]>a[j]) {aux=b[i];b[i]=b[j];b[j]=aux;aux=a[i];a[i]=a[j];a[j]=aux;aux=x;x=-y;y=-aux;}
i=i+x;j=j+y;}
return i;}
void sort(int i,int j)
{if(i>=j) return;
int k=poz(i,j);
sort(i,k-1);
sort(k+1,j);}
int main()
{freopen("partitie.in","r",stdin);
freopen("partitie.out","w",stdout);
scanf("%d %d",&n,&k);
for(i=1;i<=n;i++) {scanf("%d",&a[i]);b[i]=i;}
sort(1,n);
//radixsort();
nr=1;j=1;
for(i=2;i<=n;i++)
if(a[i]-a[j]<k) nr++;
else{if(nr>m)m=nr;j++;}
for(i=1;i<=n;i++) aux[b[i]]=(i-1)%m+1;
printf("%d\n",m);
for(i=1;i<=n;i++) printf("%d\n",aux[i]);
fclose(stdout);
return 0;}