Cod sursa(job #408649)

Utilizator hungntnktpHungntnktp hungntnktp Data 3 martie 2010 10:04:50
Problema Subsir crescator maximal Scor 60
Compilator fpc Status done
Runda Arhiva educationala Marime 1.52 kb
{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.