Pagini recente » Cod sursa (job #127938) | Cod sursa (job #1523768) | Diferente pentru documentatie/textile intre reviziile 38 si 39 | Cod sursa (job #2021835) | Cod sursa (job #125344)
Cod sursa(job #125344)
#include <set>
#include <algorithm>
#include <cstdio>
using namespace std;
long n,d;
long sol[300002];
struct rec {
long nr,pz;
} v[300002];
set<int> a;
bool fcmp( const rec &a, const rec &b){ return (a.nr<b.nr);}
void iofile(void){
freopen("partitie.in","rt",stdin);
freopen("partitie.out","wt",stdout);
scanf("%ld%ld",&n,&d);
for (int i=1;i<=n;i++){
scanf("%ld",&v[i]);
v[i].pz=i;
}
sort(v+1,v+n+1,fcmp);
fclose(stdin);
}
void solve(void){
int st,dr,mind,ind;
int min,max,i;
st=dr=mind=1;
sol[v[1].pz]=1;
a.insert(1);
for (i=2;i<=n;i++){
dr++;
while (v[dr].nr-v[st].nr>=d && st<dr){
a.erase(a.find(sol[v[st].pz]));
st++;
}
if (a.empty()){min=0;} else{
min=(*(a.begin())); }
if (a.empty()){max=0;} else {
{set<int>::iterator fmm=a.end();--fmm;max=*fmm; } }
if (min<=1){
ind=max+1;
if (ind>mind){mind=ind;};
} else{
ind=min-1;}
sol[v[i].pz]=ind;
a.insert(ind);
}
printf("%ld\n",mind);
for (i=1;i<=n;i++){
printf("%ld\n",sol[i]);
}
fclose(stdout);
}
int main(void){
iofile();
solve();
return 0;
}