Pagini recente » Cod sursa (job #1824392) | Cod sursa (job #970327) | Cod sursa (job #2281815) | Cod sursa (job #2316083) | Cod sursa (job #2406578)
#include <bits/stdc++.h>
#include <set>
#define Nax 300001
int n,d;
std::pair<int,int>v[Nax];
int poz[Nax];
int f[Nax][2];
int nax;
using namespace std;
ifstream fin("partitie.in");
ofstream fout("partitie.out");
void part(int st,int dr, int &stst, int &stdr, int &drst, int &drdr)
{
int i, j;
pair <int,int> piv,aux;
piv = v[(st+dr)/2];
i = st - 1; j = dr + 1;
while (i < j) {
do {i++;} while (v[i].first < piv.first);
do {j--;} while (v[j].first > piv.first);
if (i < j)
{
aux = v[i]; v[i] = v[j]; v[j] = aux;
}
}
stst = st; drdr = dr;
if (i==j) { stdr = j - 1; drst = i + 1; }
else { stdr = j; drst = i; }
}
void Sort(int st, int dr)
{
int stst, stdr, drst, drdr;
if (st<dr)
{
part(st,dr,stst,stdr,drst,drdr);
Sort(stst,stdr);
Sort(drst,drdr);
}
}
int main()
{
fin>>n>>d;
for(int i=1;i<=n;i++) {fin>>v[i].first; v[i].second=i;}
Sort(1,n);
f[1][0]=1;
f[1][1]=1;
poz[v[1].second]=1;
nax=1;
for(int i=2;i<=n;i++)
{
bool ok=0;
for(int j=1;j<=nax && !ok;j++)
{
if(v[i].first-v[f[j][1]].first>=d)
{
ok=1;
f[j][0]++;
f[j][1]=i;
poz[v[i].second]=j;
}
}
if(!ok)
{
nax++;
f[nax][0]=1;
f[nax][1]=i;
poz[v[i].second]=nax;
}
}
fout<<nax<<'\n';
for(int i=1;i<=n;i++)
fout<<poz[i]<<'\n';
return 0;
}