Pagini recente » Cod sursa (job #2816505) | Cod sursa (job #1531501) | Cod sursa (job #1560881) | Cod sursa (job #3237549) | Cod sursa (job #408649)
Cod sursa(job #408649)
{DINH QUANG DAT TIN 07-10}
{SCMAX}
CONST
TFI='scmax.in';
TFO='scmax.out';
MAX=100001;
TYPE
arr1int=array[0..MAX] of longint;
VAR
fi,fo:text;
cnt,m,n:longint;
res,trace,f,startof,a:arr1int;
PROCEDURE input;
var
i:longint;
begin
assign(fi,tfi);reset(fi);
read(fi,n);
for i:= 1 to n do read(fi,a[i]);
close(fi);
end;
PROCEDURE init;
begin
end;
FUNCTION find(x:longint):longint;
var
j,l,r,mid:longint;
begin
l:=1;
r:=m;
find:=0;
while l<=r do
begin
mid:=(l+r) div 2;
j:=startof[mid];
if a[j]<x then
begin
l:=mid+1;
find:=j;
end else r:=mid-1;
end;
end;
PROCEDURE process1;
var
i,j,k:longint;
begin
f[1]:=1;
startof[1]:=1;
m:=1;
for i:= 2 to n do
begin
j:=find(a[i]);
k:=f[j]+1;
f[i]:=k;
trace[i]:=j;
if k>m then
begin
inc(m);
startof[m]:=i;
end
else if a[startof[k]]>a[i] then startof[k]:=i;
end;
end;
PROCEDURE process2;
var
x,i:longint;
begin
cnt:=0;
for i:= 1 to n do
if cnt<f[i] then
begin
x:=i;
cnt:=f[i];
end;
m:=0;
inc(m);
res[m]:=a[i];
repeat
i:=trace[i];
if i=0 then break;
inc(m);
res[m]:=a[i];
until false;
end;
PROCEDURE process;
begin
process1;
process2;
end;
PROCEDURE output;
var
i:longint;
begin
assign(fo,tfo);rewrite(fo);
writeln(fo,cnt);
for i:= cnt downto 1 do write(fo,res[i],' ');
close(fo);
end;
BEGIN
input;
init;
process;
output;
END.