Pagini recente » Diferente pentru documentatie/textile intre reviziile 93 si 92 | Cod sursa (job #2022229) | Cod sursa (job #789843) | Cod sursa (job #1243774) | Cod sursa (job #558540)
Cod sursa(job #558540)
type buf=array[1..1 shl 17] of char;
var v, fin:array[1..30000] of integer;
a:array[1..65536] of integer;
buf1, buf2:buf;
i, j, n, x, y:integer;
ok:boolean;
f, g:text;
procedure act(k, st, dr:integer);
var mij:integer;
begin
if st >= x then a[k]:=a[k]+1
else
begin
mij := (st+dr) div 2;
if x <= mij then act(k*2, st, mij);
act(k*2+1, mij+1, dr);
end;
end;
procedure caut (k, st, dr:integer);
var mij:integer;
begin
y:=y+a[k];
if (st=dr) then
begin
if st=x+y then
begin
x:=x+y;
fin[x]:=i;
ok:=false;
end;
end
else
begin
mij := (st+dr) div 2;
if x+y<= mij then
begin
caut (k*2, st, mij);
y:=y-a[2*k];
end;
if ok then
begin
caut (k*2+1, mij+1, dr);
y:=y-a[2*k+1];
end;
end;
end;
begin
assign (f, 'schi.in'); settextbuf (f, buf1); reset (f);
assign (g, 'schi.out'); settextbuf (f, buf2); rewrite (g);
read (f, n); for i := 1 to n do read (f, v[i]);
for i := n downto 1 do
begin
x:= v[i];
ok:=true; y:=0;
caut(1, 1, n);
act(1, 1, n);
end;
for i := 1 to n do writeln (g, fin[i], ' ');
close (f); close (g);
end.