【题意】
有n个数序列s,求出满足s[i]<s[k]<s[j](i<k<j,j>=i+1)的最大j-i的值
【输入】
多组数据
每组数据第一行为n
第二行为n个数,描述s
【输出】
对于每组数据输出最大的j-i的值
可以转化为rmq问题
枚举i,可以通过二分找到满足之间最小数大于p[i]的最右端i`
然后又可以找到i+1到i`之间的最大值k
然后再通过二分查找最靠左的值为k的位置
program poj2452; type arr=array [0..16,0..50001] of longint; var n,i,j,k,s,e,ans,mid:longint; p:array [0..50001] of longint; max,min:arr; function wmax (a,b:longint;var max:arr;x:longint):longint; var k:longint; begin if a=b then exit(p[a]); k:=trunc(ln(b-a+1)/ln(2)); if max[k,a]*x>max[k,b-(1 shl k)+1]*x then exit(max[k,a]) else exit(max[k,b-(1 shl k)+1]); end; procedure st (var max:arr;x:longint); begin for i:=1 to n do max[0,i]:=p[i]; k:=0; while 1 shl k<n do begin for i:=1 to n do if i+(1 shl k)>n then max[k+1,i]:=max[k,i] else if max[k,i]*x>max[k,i+(1 shl k)]*x then max[k+1,i]:=max[k,i] else max[k+1,i]:=max[k,i+(1 shl k)]; inc(k); end; end; begin while not seekeof do begin read(n); for i:=1 to n do read(p[i]); if n<=1 then begin writeln(-1); continue; end; st(max,1); st(min,-1); ans:=0; for i:=1 to n-1 do begin if p[i+1]<=p[i] then continue; s:=i+1; e:=n; while s<>e do begin mid:=s+e-(s+e) div 2; if wmax(i+1,mid,min,-1)>p[i] then s:=mid else e:=mid-1; end; k:=wmax(i+1,s,max,1); if p[i+1]=k then begin if ans<1 then ans:=1; continue; end; s:=i+2; while s<>e do begin mid:=s+e-(s+e) div 2; if wmax(i+1,mid-1,max,1)<k then s:=mid else e:=mid-1; end; if e-i>ans then ans:=e-i; end; if ans=0 then writeln(-1) else writeln(ans); end; end.