Pagini recente » Cod sursa (job #2613640) | Cod sursa (job #32130) | Cod sursa (job #358656) | Cod sursa (job #559872) | Cod sursa (job #125044)
Cod sursa(job #125044)
program partitie;
var a,poz,min,max:array[1..300000] of longint;
f,g:text;
n,i,d,j,k,dimh:longint;
gasit:boolean;
procedure repair(i:longint);
var l,r,max,aux:longint;
begin
l:=2*i;
r:=l+1;
max:=i;
if (l<=dimh)and(a[l]>a[max]) then
max:=l;
if (r<=dimh)and(a[r]>a[max]) then
max:=r;
if max<>i then
begin
aux:=a[i];
a[i]:=a[max];
a[max]:=aux;
repair(max);
end;
end;
procedure buildheap(h:longint);
var i:longint;
begin
for i:=h div 2 downto 1 do
repair(i);
end;
procedure heapsort(h:longint);
var i,aux:longint;
begin
buildheap(h);
for i:=h downto 2 do
begin
aux:=a[1];
a[1]:=a[i];
a[i]:=aux;
dec(dimh);
repair(1);
end;
end;
begin
assign(f,'partitie.in'); assign(g,'partitie.out');
reset(f); rewrite(g);
read(f,n,d);
for i:=1 to n do read(f,a[i]);
dimh:=n;
heapsort(n);
poz[1]:=1; min[1]:=a[1]; max[1]:=min[1]; j:=1;
for i:=2 to n do
begin
gasit:=false;
k:=0;
while (k<j) and (gasit=false) do
begin
k:=k+1;
if a[i]<=min[k]-d then begin poz[i]:=k; min[k]:=a[i]; gasit:=true; end;
if a[i]>=max[k]+d then begin poz[i]:=k; max[k]:=a[i]; gasit:=true; end;
end;
if gasit=false then begin j:=j+1; poz[i]:=j; min[j]:=a[i]; max[j]:=a[i]; end;
end;
writeln(g,j);
for i:=1 to n do writeln(g,poz[i]);
close(f); close(g);
end.