Cod sursa(job #125080)

Utilizator IoannaPandele Ioana Ioanna Data 20 ianuarie 2008 11:16:37
Problema Partitie Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 10-a Marime 1.34 kb
#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;
}