P1816 忠诚

/*
https://www.luogu.com.cn/problem/P1816
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e5+10 ;
const int mod=998244353;
const int inf=0x3f3f3f3f;

int a[maxn],f[maxn][23],n,m,lg[maxn]={-1};

void pre_dp()
{
    for(int i=1;i<=m;i++) f[i][0]=a[i];
    for(int i=1;i<=20;i++){
        for(int j=1;j+(1<<i)-1<=m;j++)
            f[j][i]=min(f[j][i-1],f[j+(1<<i-1)][i-1]);
    }
}
int query(int a,int b){
    int k=lg[b-a+1];
    return min(f[a][k],f[b-(1<<k)+1][k]);
}
int main()
{
    ios::sync_with_stdio(false);
    memset(f,inf,sizeof(f));
    cin>>m>>n;
    for(int i=1;i<=m;i++) cin>>a[i],lg[i]=lg[i>>1]+1;
    
    pre_dp();
    for(int i=1;i<=n;i++){
        int a,b;cin>>a>>b;
        cout<<query(a,b)<<" ";
    }
    
    return 0;
}

 

posted @ 2023-10-22 14:39  JMXZ  阅读(9)  评论(0)    收藏  举报