预处理F数组代码:
For i:=1 to n do f[I,0]:=a[i]
for j:=1 to trunc(ln(n)/ln(2)) do begin // 用到了换底公式,数学果然很重要
for i:=1 to n+1-1 shl j do
f[I,j]:=max(f[I,j-1],f[i+1 shl (j-1),j-1])
End;
对于询问[L,R],求出最大的x,满足2^x<=R-L+1,即x=trunc(ln(R-L+1)/ln(2))
[L,R]=[L,L+2^x-1] ∪[R+1-2^x,R],两个子区间元素个数都是2^x个,如图