今天下午大帝讲的,我以前也不懂,所以也就跟着学学了,把中间的那个状态转移方程学错了好几次,于是就wa了
好几发。
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 200010
using namespace std;
int a[maxn],m,n,b[maxn],fl[maxn][50],fr[maxn][50];
void solve()
{
b[1]=0;//其实就是用来计算除以log2的值
for(int i=2;i<=m;i++)
{
b[i]=b[i-1];
if((1<<b[i]+1)==i) b[i]++;
}
for(int i=0;i<m;i++) fl[i][0]=fr[i][0]=a[i];
for(int i=m-1;i>=0;i--)
for(int j=1;i+(1<<j)-1<m;j++)//容易出错的地方
{
fl[i][j]=min(fl[i][j-1],fl[i+(1<<j-1)][j-1]);
fr[i][j]=max(fr[i][j-1],fr[i+(1<<j-1)][j-1]);
}
}
int qma(int l,int r)
{
int len=(r-l+1);
int k=b[len];
return max(fr[l][k],fr[r-(1<<k)+1][k]);
}
int qmi(int l,int r)
{
int len=r-l+1;
int k=b[len];
return min(fl[l][k],fl[r-(1<<k)+1][k]);
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++) cin>>a[i];
solve();
while(n--)
{
int u,v;
cin>>u>>v;
u--;
v--;
printf("%d\n",qma(u,v)-qmi(u,v));
}
return 0;
}