概念
RMQ是英文Range Maximum(Minimum) Query的缩写,顾名思义是用来求某个区间内的最大值或最小值,通常用在要多次询问一些区间的最值的问题中。
代码
uses math;
Var n,m,i,j,k,r,l:longint;
f:array[0..100001,0..21] of longint;
Begin
read(n,m);
for i:=1 to n do
read(f[i][0]);
for j:=1 to trunc(ln(n)/ln(2)) do
Begin
for i:=1 to n+1-(1 shl j) do
Begin
f[i][j]:=max(f[i][j-1],f[i+(1 shl (j-1))][j-1]);
end;
end;
for i:=1 to m do
Begin
read(l,r);
k:=trunc(ln(r-l+1)/ln(2));
writeln(max(f[l][k],f[r-(1 shl k)+1][k]));
end;
end.