RMQ问题模板

来源:互联网 发布:纪念碑谷mac版 编辑:程序博客网 时间:2024/06/05 17:05
#include<bits/stdc++.h>using namespace std;#define MAXN 1000+10int dp[MAXN][MAXN], a[MAXN]; void InitRMQ(int l, int r, int n){    int k = floor((double)log(r-l+1)/log(2));    for (int i = 1; i <= n; ++i) dp[i][0] = a[i];    for (int j = 1; j <= r-l+1; ++j)        for (int i = 1; i+(1<<j-1) <= r; ++i)            dp[i][j] = max(dp[i][j-1], dp[i+(1<<j-1)][j-1]); }int getmax(int l, int r){    int k = floor((double)log(r-l+1)/log(2));    return max(dp[l][k], dp[r-(1<<k)][k]);}int main(){    int n, q;    cin>>n>>q;    for (int i = 1; i <= n; ++i) cin>>a[i];    InitRMQ(1, n, n);    int l, r;    while(q--){        cin>>l>>r;        cout<<getmax(l, r)<<endl;    }    return 0;}
0 0
原创粉丝点击