Pagini recente » Cod sursa (job #1518649) | Cod sursa (job #2872760) | Cod sursa (job #3280223) | Cod sursa (job #2829001) | Cod sursa (job #922607)
Cod sursa(job #922607)
#include <fstream>
#include <algorithm>
using namespace std;
const int dim = 300005;
int N, D, H[dim];
struct val { int val, i, p; } A[dim];
bool cmp1 (val a, val b) { return a.val < b.val; }
bool cmp2 (val a, val b) { return a.i < b.i; }
bool cmp_heap (int a, int b) { return A[H[a]].val < A[H[b]].val; }
void upheap (int n)
{
int t = n >> 1;
while (t != 0 && cmp_heap (n, t))
{
swap (H[n], H[t]);
n = t;
t = n >> 1;
}
}
void downheap (int n)
{
int f = n << 1;
if (f+1 <= H[0] && cmp_heap (f+1, f)) f++;
while (f <= H[0] && cmp_heap (f, n))
{
swap (H[n], H[f]);
n = f;
f = n << 1;
if (f+1 <= H[0] && cmp_heap (f+1, f)) f++;
}
}
int main ()
{
freopen ("partitie.in", "r", stdin);
freopen ("partitie.out", "w", stdout);
scanf ("%d%d", &N, &D);
for (int i = 1; i <= N; i++)
{
scanf ("%d", &A[i].val);
A[i].i = i;
}
sort (A + 1, A + N + 1, cmp1);
H[++H[0]] = 1;
A[1].p = 1;
for (int i = 2; i <= N; i++)
{
if (A[i].val - A[H[1]].val < D)
{
H[++H[0]] = i;
A[i].p = H[0];
upheap (H[0]);
}
else
{
A[i].p = A[H[1]].p;
H[1] = i;
downheap (1);
}
}
sort (A + 1, A + N + 1, cmp2);
printf ("%d\n", H[0]);
for (int i = 1; i <= N; i++)
printf ("%d\n", A[i].p);
return 0;
}