P1816 忠诚
RMQ 模板题
/* */ #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; }