Pagini recente » Cod sursa (job #169887) | Cod sursa (job #2166539) | Cod sursa (job #2307821) | Cod sursa (job #979339) | Cod sursa (job #344444)
Cod sursa(job #344444)
#include<stdio.h>
#include<algorithm>
#include<utility>
using namespace std;
pair <int,int> v[300010];
int n,d,nm,i,j,k,left[300010],up[300010],ff[300010];
void read(),solve();
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("partitie.in","r",stdin);
freopen("partitie.out","w",stdout);
scanf("%d%d",&n,&d);
for(i=1;i<=n;i++){scanf("%d",&v[i].first);v[i].second=i;}
}
void solve()
{
int L,R,C;
sort(v+1,v+n+1);v[0].first=-d-1;
for(i=1;i<=n;i++)
{
L=left[i-1];R=i;
while(R-L-1)
{
C=(L+R)>>1;
if(v[i].first-v[C].first>=d)L=C;
else R=C;
}
left[i]=L;
}
for(i=1;i<=n;i++)ff[i]=i;
for(i=1;i<=n;i++)
{
j=left[i];
if(!j)continue;
if(!up[j]){up[j]=i;for(k=j;up[k];k++)ff[k]=ff[j-1];continue;}
j=ff[j];if(!j)continue;
up[j]=i;
for(k=j;up[k];k++)ff[k]=ff[j-1];
}
for(i=1;i<=n;i++)v[i].first=0;
for(i=1;i<=n;i++)
{
if(v[i].first)continue;
nm++;
j=i;
for(;;)
{
v[j].first=nm;
if(!up[j])break;
j=up[j];
}
}
for(i=1;i<=n;i++)up[v[i].second]=v[i].first;
printf("%d\n",nm);
for(i=1;i<=n;i++)
printf("%d\n",up[i]);
}