RMQ-ST模板

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>

#define LOCAL
#define ll long long
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007

using namespace std;
/*

题意:RMQ-ST算法

想法:模板

*/
int  A[MAX];
int dp[1009][1009];
int n ;

int RMQ_init()
{
    for(int i = 1; i<=n; i++) dp[i][0] = A[i];//初始化
    for(int j = 1; (1<<j)<=n; j++)//2的j次方
        for(int i = 1; i + j - 1<=n; i++)//从i开始,长度为2的j次方的一段元素的最小值
            dp[i][j] = min(dp[i][j- 1],dp[i+(1<<(j- 1))][j - 1]);
}
int RMQ(int L,int R)
{
    int k = 0;
    while((1<<(k+1))<=R - L + 1)k++;//找到符合L - R的符合区间
    return min(dp[L][k],dp[R - (1<<k) + 1][k]);//返回区间最小值
    
}

int main()
{
    //freopen("date.in","r",stdin);
    int m;
    cin>>n;
    for(int i = 1;i<=n;i++)
    {
        cin>>A[i];
    }
    RMQ_init();
    cin>>m;
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        if(x>y) swap(x,y);
        cout<<RMQ(x,y)<<endl;
    }
    return 0;
}

你可能感兴趣的:(RMQ-ST模板)