同忠诚1差不多,只是多开一维,用f[i,j,0]表示表示最小值,用f[i,j,1]表示最大值。
依然用ST算法优化。
program TYVJ1297;
var
i,j,k,n,m,t,x,y,rmq1,rmq2:longint;
f:array [0..100001,0..18,0..1] of longint;
function min(x,y:longint):longint;
begin
if x<y then exit(x) else exit(y);
end;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
begin
assign(input,'TYVJ1297.in'); reset(input);
assign(output,'TYVJ1297.out'); rewrite(output);
fillchar(f,sizeof(f),0);
readln(n,m);
for i:=1 to n do
begin
read(f[i,0,0]);
f[i,0,1]:=f[i,0,0];
end;
t:=trunc(ln(n)/ln(2));
for j:=1 to t do
begin
for i:=1 to (n+1-(1 << j)) do
begin
f[i,j,0]:=min(f[i,j-1,0],f[i+(1 << (j-1)),j-1,0]);
f[i,j,1]:=max(f[i,j-1,1],f[i+(1 << (j-1)),j-1,1])
end;
end;
for i:=1 to m do
begin
read(x,y);
k:=trunc(ln(y-x+1)/ln(2));
rmq1:=min(f[x,k,0],f[y+1-(1 << k),k,0]);
rmq2:=max(f[x,k,1],f[y+1-(1 << k),k,1]);
write(rmq2,' ',rmq1);
end;
close(input); close(output);
end.