倍增与ST表

#include<bits/stdc++.h>
using namespace std;
#define MAXN 50010
int n,q,h[MAXN],log_2[MAXN],rmax[MAXN][18],rmin[MAXN][18];
void init()//ST表的建立 
{
	for(int i = 1;i <= n;i++)
		rmax[i][0] = rmin[i][0] = h[i];//第一列初始化 
	for(int j = 1;(1<<j) <= n;j++)//j不大于log2(n) 
	{
		for(int i = 1;i <= n-(1<<j) + 1;i++)//每往后一列,行数减少,减少量为1<<j 
		{
			rmax[i][j] = max(rmax[i][j - 1],rmax[i + 1<<(j-1)][j-1]);//后一列最大值的赋值 
			rmin[i][j] = min(rmin[i][j - 1],rmin[i + 1<<(j-1)][j-1]);//后一列最小值的赋值 
		}
	}
}
//区间最大值 
int query_max(int A,int B)
	{
		int x = log_2[B - A + 1];
		return max(rmax[A][x],rmax[B-(1<<x) + 1][x]);
	}
//区间最小值 
int query_min(int A,int B)
{
	int x = log_2[B - A + 1];
	return min(rmin[A][x],rmin[B-(1<<x) + 1][x]);
}
int main(){
	cin>>n>>q;
	for(int i = 1;i <= n;i++)
		cin>>h[i];//输入数值的值
	for(int i = 2;i <= n;i++)
	{
		log_2[i] = log_2[i>>1] + 1;
	 } 
	init();
	while(q--)
	{
		int A,B;
		cin>>A>>B;
		cout<<"max="<<query_max(A,B)<<endl;
		cout<<"min="<<query_min(A,B);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七七七_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值