Pagini recente » Cod sursa (job #1741005) | Cod sursa (job #2238600) | Cod sursa (job #1747255) | Cod sursa (job #879487) | Cod sursa (job #374178)
Cod sursa(job #374178)
using namespace std;
#include <fstream>
#include <iostream>
#include <algorithm>
#define NN 300010
int a[NN],poz[NN],part[NN],n,nrp,d,heap[NN];
bool MaiMic(int i,int j){
return a[i]<a[j];
}
void Cerne(int k){
int esteheap=0,i, aux;
while(!esteheap && 2*k<=nrp){
i=2*k;
if(i<nrp && a[heap[i]] > a[heap[i+1]])
i++;
if(a[heap[k]]<=a[heap[i]])
esteheap=1;
else{
aux=heap[i]; heap[i]=heap[k];heap[k]=aux;
k=i;
}
}
}
void Proceseaza(int poz){
//prelucrez elementul de pe pozitia poz din a;
if(nrp==0){
nrp++;
heap[nrp]=poz;
part[poz]=nrp;
}
else
if(a[poz]-a[heap[1]]>=d){
part[poz]=part[heap[1]];
heap[1]=poz;
Cerne(1);
}
else
{
nrp++;
part[poz]=nrp;
heap[nrp]=poz;
}
}
int main(){
ifstream fin("partitie.in");
fin>>n>>d;
for(int i=1;i<=n;i++)
fin>>a[i],poz[i]=i;
sort(poz+1,poz+n+1,MaiMic);
//for(int i=1;i<=n;i++)
// cout<<poz[i]<<" ";
for(int i=1;i<=n;i++){
Proceseaza(poz[i]);
}
ofstream fout("partitie.out");
fout<<nrp<<endl;
for(int i=1;i<=n; ++i)
fout<<part[i]<<"\n";
return 0;
}