```cpp
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int n,m,a[1000005],st[1000005][100],bit[100],l,r,b;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]),st[i][0]=a[i];
int ln=(int)(log(n)/log(2));
for (int i=1;i<=ln;i++){
for (int j=1;j<=n-(1<<i)+1;j++){
st[j][i]=max(st[j][i-1],st[j+(1<<(i-1))][i-1]);
}
}
for (int i=1;i<=m;i++){
scanf("%d%d",&l,&r);
int y=(int)(log(r-l+1)/log(2));
printf("%d\n",max(st[l][y],st[r-(1<<y)+1][y]));
}
return 0;
}
```
写错了,这是AC代码,但还是不知道为什么开数组就不过
by sr123R456 @ 2022-07-26 09:59:11
改成
```cpp
bit[0]=1;b=1;
while (bit[b]<=1000005){
bit[b]=bit[b-1]<<1;
++b;
}
```
即可
by dxy2020 @ 2022-07-26 10:13:50
你b不设成1就是
```
bit[0]=bit[-1]<<1
```
by dxy2020 @ 2022-07-26 10:14:40
@ [sr123R456](https://www.luogu.com.cn/user/445303)
by dxy2020 @ 2022-07-26 10:17:54
b初始为零,++b不就先让它加1再算吗,这样后面的b-1不就是0了吗.
这两个效果应该一样吧,bit数组我检查过了,存的数都正确啊,为什么我那样就错了?能详细说下吗?
```cpp
bit[0]=1;b=1;
while (bit[b-1]<=1000005){
bit[b]=bit[b-1]<<1;
++b;
}
```
还有,while中数组下标应该用b-1吧。
@[小小蒟蒻一只](/user/366254)
by sr123R456 @ 2022-07-26 23:47:22
@[sr123R456](/user/445303) 赋值语句好像是从右向左运算
by dxy2020 @ 2022-07-27 07:59:38
@[小小蒟蒻一只](/user/366254) 如果这样的话,为什么数组里的内容都正确呢?我的赋值语句是不是相当于bit[1]= bit[-1]<<1;呢?
by sr123R456 @ 2022-07-27 09:17:09
@[sr123R456](/user/445303) 那应该UB了吧
我也不大清楚数组里的值为什么是对的。。
by dxy2020 @ 2022-07-27 09:33:26
@[小小蒟蒻一只](/user/366254) UB什么意思?
by sr123R456 @ 2022-07-27 10:46:29
@[sr123R456](/user/445303) [undefined behaviour](https://www.jb51.net/article/105305.htm)
by dxy2020 @ 2022-07-27 11:28:41