Pagini recente » Cod sursa (job #3285895) | Cod sursa (job #137582) | Cod sursa (job #2894217) | Cod sursa (job #1821083) | Cod sursa (job #35223)
Cod sursa(job #35223)
{$D-,Q-,R-}
const finame = 'schi.in';
foname = 'schi.out';
type tvec = ^vec;
vec = array [1..30001] of integer;
var val, cnt, h, l, r : tvec;
a, NULL, mcnt : integer;
N, i, j, pos, k : integer;
fi, fo : text;
{
l1 : longint;
l2 : longint absolute $0:$46c;
}
procedure init;
begin
new(val);
new(cnt);
new(h);
new(l);
new(r);
mcnt := 1;
h^[1] := 0;
cnt^[1] := 0;
l^[1] := 0; r^[1] := 0; {point to nowhere}
NULL := 1; a := 1; {point to 1}
end;
function insert(_val : integer; n : integer) : integer;
begin
if n = NULL then
begin
inc(mcnt);
n := mcnt;
val^[n] := _val;
h^[n] := 1;
cnt^[n] := 1;
l^[n] := NULL;
r^[n] := NULL;
insert := n;
exit;
end;
if pos >= cnt^[l^[n]] + 1 then
begin
dec(pos, cnt^[l^[n]] + 1);
r^[n] := insert(_val, r^[n])
end
else
l^[n] := insert(_val, l^[n]);
if h^[l^[n]] > h^[r^[n]] then
h^[n] := 1 + h^[l^[n]]
else
h^[n] := 1 + h^[r^[n]];
inc(cnt^[n]);
if h^[l^[n]] > h^[r^[n]] + 1 then
begin
if h^[r^[l^[n]]] > h^[l^[l^[n]]] then
begin
{l^[n] := leftrot(l^[n]);}
k := r^[ l^[n] ];
cnt^[l^[n]] := cnt^[l^[n]] - cnt^[k] + cnt^[l^[k]];
dec(cnt^[k], cnt^[l^[k]]);
r^[l^[n]] := l^[k];
inc(cnt^[k], cnt^[l^[n]]);
l^[k] := l^[n];
if h^[l^[l^[n]]] > h^[r^[l^[n]]] then
h^[l^[n]] := 1 + h^[l^[l^[n]]]
else
h^[l^[n]] := 1 + h^[r^[l^[n]]];
if h^[l^[k]] > h^[r^[k]] then
h^[k] := 1 + h^[l^[k]]
else
h^[k] := 1 + h^[r^[k]];
l^[n] := k;
end;
{n := rightrot(n);}
k := l^[n];
cnt^[n] := cnt^[n] - cnt^[k] + cnt^[r^[k]];
dec(cnt^[k], cnt^[r^[k]]);
l^[n] := r^[k];
inc(cnt^[k], cnt^[n]);
r^[k] := n;
if h^[l^[n]] > h^[r^[n]] then
h^[n] := 1 + h^[l^[n]]
else
h^[n] := 1 + h^[r^[n]];
if h^[l^[k]] > h^[r^[k]] then
h^[k] := 1 + h^[l^[k]]
else
h^[k] := 1 + h^[r^[k]];
n := k;
end;
if h^[r^[n]] > h^[l^[n]] + 1 then
begin
if h^[l^[r^[n]]] > h^[r^[r^[n]]] then
begin
{r^[n] := rightrot(r^[n]);}
k := l^[r^[n]];
cnt^[r^[n]] := cnt^[r^[n]] - cnt^[k] + cnt^[r^[k]];
dec(cnt^[k], cnt^[r^[k]]);
l^[r^[n]] := r^[k];
inc(cnt^[k], cnt^[r^[n]]);
r^[k] := r^[n];
if h^[l^[r^[n]]] > h^[r^[r^[n]]] then
h^[r^[n]] := 1 + h^[l^[r^[n]]]
else
h^[r^[n]] := 1 + h^[r^[r^[n]]];
if h^[l^[k]] > h^[r^[k]] then
h^[k] := 1 + h^[l^[k]]
else
h^[k] := 1 + h^[r^[k]];
r^[n] := k;
end;
{n := leftrot(n);}
k := r^[n];
cnt^[n] := cnt^[n] - cnt^[k] + cnt^[l^[k]];
dec(cnt^[k], cnt^[l^[k]]);
r^[n] := l^[k];
inc(cnt^[k], cnt^[n]);
l^[k] := n;
if h^[l^[n]] > h^[r^[n]] then
h^[n] := 1 + h^[l^[n]]
else
h^[n] := 1 + h^[r^[n]];
if h^[l^[k]] > h^[r^[k]] then
h^[k] := 1 + h^[l^[k]]
else
h^[k] := 1 + h^[r^[k]];
n := k;
end;
insert := n;
end;
procedure dfs(n : integer);
begin
if n = NULL then exit;
dfs(l^[n]);
writeln(fo, val^[n]);
dfs(r^[n]);
end;
{
procedure gen;
begin
N := 30000;
assign(fo, finame); rewrite(fo);
writeln(fo, N);
for i := 1 to N do
writeln(fo, random(i) + 1);
close(fo);
end;
procedure brute_force;
begin
assign(fi, finame); reset(fi);
readln(fi, N);
new(cnt);
for i := 1 to N do
begin
readln(fi, j);
for k := i downto j + 1 do
cnt^[k] := cnt^[k - 1];
cnt^[j] := i;
end;
close(fi);
assign(fo, 'schi.ok'); rewrite(fo);
for i := 1 to N do
writeln(fo, cnt^[i]);
close(fo);
dispose(cnt);
end;
}
begin
{
l1 := l2;
}
init;
assign(fi, finame); reset(fi);
readln(fi, N);
for i := 1 to N do
begin
readln(fi, pos);
dec(pos);
a := insert(i, a);
end;
close(fi);
assign(fo, foname); rewrite(fo);
dfs(a);
close(fo);
{
writeln((l2 - l1) * 55,' ms');
}
end.