TYVJ1297(小气的小B)

同忠诚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.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值