RMQ 区间最大值 最小值查询

/*RMQ  更新最小值操作  By:draymonder*/

#include <iostream>
#include <cstdio>

using namespace std;
const int mod = 1e9 + 7;
const int maxn = 1 << 17;
const int INF = 0x3f3f3f3f;
typedef long long LL;

int n,s[2*maxn-1];

void init(int a)//把元素个数扩充到2的幂  简便
{
    n = 1;
    while (n < a)
        n*=2;
    for(int i=0;i<2*n-1;i++)
        s[i] = INF;  //把所有的值 都变成INF

}

void update(int k,int a)//把第k个值更新为a
{
    k += n-1;
    s[k] = a;//找到 只是k的这个区间的位置  然后依次更新
    while (k > 0)
    {
        k = ( k - 1 )/2;
        s[k] = min(s[k*2+1],s[k*2+2]);
    }
}
//求[a,b)的最小值
//后面的参数是为了计算起来方便而传入的
//k是节点的编号,l,r表示这个节点对应的[l,r)区间
//在外部调用的时候用query(a,b,0,0,n)

int query(int a,int b,int k,int l,int r)
{
    if(r <= a || b <= l) return INF;//[a,b) 与 [l,r)不相交
    //如果 [a,b)完全包含[l,r) 直接返回当前k节点的值
    if(a <= l && r<= b) return s[k];
    else {
        //否则返回两个儿子中值较小者
        int v1 = query(a,b,k*2+1, l , (l+r)/2);
        int v2 = query(a,b,k*2+1,(l+r)/2 , r);
        return min(v1,v2);
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值