LEM5 - ARITHMETIC PROGRESSION
Tác giả: flashmt
Ngôn ngữ: Pascal
uses math;
const fi='';
maxn=100010;
var n,i,re,nn:longint;
a,b,l,r,d,c:array[0..maxn] of longint;
f:array[1..maxn,1..100] of longint;
procedure sort(l,r:longint);
var i,j,x,y,t:longint;
begin
i:=l; j:=r; x:=a[(i+j) shr 1]; t:=d[(i+j) shr 1];
repeat
while (a[i]<x) or ((a[i]=x) and (d[i]<t)) do inc(i);
while (a[j]>x) or ((a[j]=x) and (d[j]>t)) do dec(j);
if i<=j then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
y:=d[i]; d[i]:=d[j]; d[j]:=y;
inc(i); dec(j);
end;
until i>j;
if i<r then sort(i,r);
if l<j then sort(l,j);
end;
procedure edit;
var i:longint;
begin
c[0]:=-maxlongint;
for i:=1 to n do
begin
if a[i]>c[nn] then
begin
r[nn]:=i-1;
inc(nn);
c[nn]:=a[i];
l[nn]:=i;
end;
b[d[i]]:=nn;
end;
r[nn]:=n;
end;
function bs(ll,rr,val:longint):longint;
var mid,i,l,r:longint;
begin
bs:=0; l:=ll; r:=rr;
while l<=r do
begin
mid:=(l+r) shr 1;
if d[mid]<val then l:=mid+1
else r:=mid-1;
end;
for i:=mid+1 downto mid-1 do
if (i>=ll) and (i<=rr) and (d[i]<val) then exit(d[i]);
end;
procedure pr;
var i,j,dif,x,y:longint;
begin
for i:=1 to n do
begin
x:=b[i];
for j:=x-1 downto 1 do
begin
dif:=c[x]-c[j];
if dif>100 then break
else
begin
y:=bs(l[j],r[j],i);
if y=0 then continue;
f[i,dif]:=max(f[i,dif],f[y,dif]+1);
re:=max(re,f[i,dif]);
end;
end;
end;
end;
begin
assign(input,fi); reset(input);
read(n);
for i:=1 to n do
begin
read(a[i]); d[i]:=i;
end;
sort(1,n);
edit;
pr;
writeln(re+1);
close(input);
end.