type node=record
num,flag:int64;
end;
var
a:array[1..50000] of node;
b:array[1..50000] of int64;
n,num:int64;
procedure qsort(head,tail:longint);
var
i,j,x:longint;
p:node;
begin
i:=head;j:=tail;x:=a[(head+tail)div 2].num;
repeat
while(x>a[i].num)do inc(i);
while(x<a[j].num)do dec(j);
if i<=j then
begin
p:=a[i];
a[i]:=a[j];
a[j]:=p;
inc(i);
dec(j);
end;
until i>j;
if i<tail then qsort(i,tail);
if head<j then qsort(head,j);
end;
procedure qsort2(head,tail:longint);
var
i,j,x,p:longint;
begin
i:=head;j:=tail;x:=b[(head+tail)div 2];
repeat
while(x>b[i])do inc(i);
while(x<b[j])do dec(j);
if i<=j then
begin
p:=b[i];
b[i]:=b[j];
b[j]:=p;
inc(i);
dec(j);
end;
until i>j;
if i<tail then qsort2(i,tail);
if head<j then qsort2(head,j);
end;
procedure init;
var
i:longint;
begin
assign(input,*spring.in*);
reset(input);
assign(output,*spring.out*);
rewrite(output);
readln(n);
for i:=1 to n do
begin
read(a[i].num);
a[i].flag:=i;
end;
close(input);
end;
procedure dis;
var
i:longint;
begin
b[a[1].flag]:=1;
num:=1;
for i:=2 to n do
begin
inc(num);
b[a[i].flag]:=num;
end;
end;
procedure swap(x,y:longint);
var p:longint;
begin
p:=b[x];b[x]:=b[y];b[y]:=p;
end;
procedure print(step:longint);
var
i:longint;
begin
write(*total*,* *,step,*:*,* *);
for i:=1 to n do
write(b[i],* *);
writeln;
writeln;
end;
procedure solve;
var
step,temp:longint;
i,j,k:longint;
flag:boolean;
begin
step:=1;
while step<=10 do
begin
flag:=false;
for i:=n-1 downto 1 do
begin
if b[i+1]>b[i] then
begin
temp:=maxlongint;
for j:=i+1 to n do
if(b[j]>b[i])and(b[j]<temp)then
begin
temp:=b[j];
k:=j;
end;
swap(i,k);
flag:=true;
qsort2(i+1,n);
end;
if flag then begin print(step);break;end;
end;
inc(step);
end;
end;
begin
init;
qsort(1,n);
dis;
solve;
close(output);
end.
num,flag:int64;
end;
var
a:array[1..50000] of node;
b:array[1..50000] of int64;
n,num:int64;
procedure qsort(head,tail:longint);
var
i,j,x:longint;
p:node;
begin
i:=head;j:=tail;x:=a[(head+tail)div 2].num;
repeat
while(x>a[i].num)do inc(i);
while(x<a[j].num)do dec(j);
if i<=j then
begin
p:=a[i];
a[i]:=a[j];
a[j]:=p;
inc(i);
dec(j);
end;
until i>j;
if i<tail then qsort(i,tail);
if head<j then qsort(head,j);
end;
procedure qsort2(head,tail:longint);
var
i,j,x,p:longint;
begin
i:=head;j:=tail;x:=b[(head+tail)div 2];
repeat
while(x>b[i])do inc(i);
while(x<b[j])do dec(j);
if i<=j then
begin
p:=b[i];
b[i]:=b[j];
b[j]:=p;
inc(i);
dec(j);
end;
until i>j;
if i<tail then qsort2(i,tail);
if head<j then qsort2(head,j);
end;
procedure init;
var
i:longint;
begin
assign(input,*spring.in*);
reset(input);
assign(output,*spring.out*);
rewrite(output);
readln(n);
for i:=1 to n do
begin
read(a[i].num);
a[i].flag:=i;
end;
close(input);
end;
procedure dis;
var
i:longint;
begin
b[a[1].flag]:=1;
num:=1;
for i:=2 to n do
begin
inc(num);
b[a[i].flag]:=num;
end;
end;
procedure swap(x,y:longint);
var p:longint;
begin
p:=b[x];b[x]:=b[y];b[y]:=p;
end;
procedure print(step:longint);
var
i:longint;
begin
write(*total*,* *,step,*:*,* *);
for i:=1 to n do
write(b[i],* *);
writeln;
writeln;
end;
procedure solve;
var
step,temp:longint;
i,j,k:longint;
flag:boolean;
begin
step:=1;
while step<=10 do
begin
flag:=false;
for i:=n-1 downto 1 do
begin
if b[i+1]>b[i] then
begin
temp:=maxlongint;
for j:=i+1 to n do
if(b[j]>b[i])and(b[j]<temp)then
begin
temp:=b[j];
k:=j;
end;
swap(i,k);
flag:=true;
qsort2(i+1,n);
end;
if flag then begin print(step);break;end;
end;
inc(step);
end;
end;
begin
init;
qsort(1,n);
dis;
solve;
close(output);
end.