Cod sursa(job #186620)
var a,p,v,l:array[0..100001] of longint;
i,j,n,pp,max,nr:longint;
function caut(x:longint):longint;
var st,dr,m,w:longint;
begin
st:=0; dr:=nr; m:=(st+dr) div 2; w:=nr;
while (st<=dr) do
if (a[l[m]]<x)and(a[l[m+1]]>=x) then begin w:=m; st:=dr+1;end
else if (a[l[m+1]]<x) then begin st:=m+1; m:=(st+dr) div 2; end
else begin dr:=m-1; m:=(st+dr) div 2;end;
caut:=w;
end;
procedure afisare(i:longint);
begin
if (p[i]>0) then afisare(p[i]);
write(a[i],' ');
end;
begin
assign(input,'scmax.in'); reset(input); assign(output,'scmax.out'); rewrite(output);
readln(n);
for i:=1 to n do read(a[i]);
v[n]:=1;l[1]:=1; l[0]:=0;
p[n]:=0; nr:=1;
max:=1; pp:=n;
for i:=2 to n do
begin
pp:=caut(a[i]);
p[i]:=l[pp];
v[i]:=pp+1;
l[pp+1]:=i;
if (nr<pp+1) then nr:=pp+1;
end;
max:=0; pp:=0;
for i:=1 to n do
if (max<v[i]) then begin
max:=v[i]; pp:=i;
end;
writeln(max);
afisare(pp);
close(input); close(output);
end.