这个是st表的入门题。
附上st表的学习链接 AC龙 。这个博客讲的挺好的。
st表的建表时间复杂度是nlogn,查询时o(1),可用于处理RMQ问题,区间覆盖对问题不会造成影响的问题。
贴上代码,模板来自上面说的学习链接
Log【i】是指2^k <= i,k能取到的最大值,st【i】【j】代表从i位置向后长度为 2^j 这个区间中的最小值。
#include <bits/stdc++.h>
using namespace std;
int n;
const int maxn = 1e5+100;
int stMin[maxn][25],a[maxn],stMax[maxn][25];
void init()
{
for(int i=1;i<=n;i++)stMax[i][0] = stMin[i][0] = a[i];
for(int j = 1; (1<<j)<=n;j++)
for(int i=1;(i+(1<<(j-1)))<=n;i++)
{
stMax[i][j] = max(stMax[i][j-1],stMax[i+(1<<(j-1))][j-1]);
stMin[i][j] = min(stMin[i][j-1],stMin[i+(1<<(j-1))][j-1]);
}
}
void solve(int l,int r)
{
int k = log(r-l+1)/log(2);
int ansMin = min(stMin[l][k],stMin[r-(1<<k)+1][k]);
int ansMax = max(stMax[l][k],stMax[r-(1<<k)+1][k]);
cout<<ansMax-ansMin<<'\n';
}
int main()
{
int m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",a+i);
init();
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
solve(u,v);
}
return 0;
}