Cod sursa(job #125418)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 20 ianuarie 2008 12:50:49
Problema Partitie Scor 80
Compilator cpp Status done
Runda preONI 2008, Runda 3, Clasa a 9-a Marime 1.64 kb
#include <stdio.h>
#include <stdlib.h>

long n,d,i,ind[300002],a[300002];
long low,mid,high;
long sub[300002],elem[300002],nrsub,value;

int comp(const void * n1, const void * n2){
    return (a[*((long*)n1)]-a[*((long*)n2)]);
}

int main(){
    freopen("partitie.in","r",stdin);
    freopen("partitie.out","w",stdout);
    
    scanf("%ld %ld",&n,&d);
    for (i=1;i<=n;i++){
        scanf("%ld",&a[i]);
        ind[i]=i;
    }
    
    qsort (ind,n+1,sizeof(long),comp);
    
    for (i=1;i<=n;i++){
        if (sub[ind[i]]==0){
           nrsub++;
           sub[ind[i]]=nrsub;
           elem[nrsub]=1;
           low = i+1;
           high = n+1;
           value=a[ind[i]]+d;
           while (low < high){
                 mid = (low + high)/2;
                 if (a[ind[mid]] < value)
                    low = mid + 1; 
                 else
                     high = mid; 
           }
           while(sub[ind[low]]&&low<n)low++;
           if (low<=n&&!sub[ind[low]]);
              {sub[ind[low]]=nrsub;elem[nrsub]++;}
        }
        else{
           low = i+1;
           high = n+1;
           value=a[ind[i]]+d;
           while (low<high){
                 mid = (low + high)/2;
                 if (a[ind[mid]] < value)
                    low = mid + 1; 
                 else
                     high = mid; 
           }
           while(sub[ind[low]]&&low<n)low++;
           if (low<=n&&!sub[ind[low]]);
              {sub[ind[low]]=sub[ind[i]];elem[sub[ind[i]]]++;}
        }
    }
    printf("%ld\n",nrsub);
    for (i=1;i<=n;i++)
        printf("%ld\n",sub[i]);
        
    return 0;
}