《j<=21》
by CEFqwq @ 2023-12-06 20:27:48
`log` 求的有问题。
`i<<1=i*2,i>>1=i/2`
求`log`的时候,`log(i)=log(i/2)+1=log(i>>1)+1`,所以改一下。
于是乎 AC 代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
int f[111111][21];
//f[i][j]=max(a[i-->(1<<j)])
int lg[111111],n,m,l,r;
void LOG(){
lg[1]=0,lg[2]=1;
for(register int i=3;i<=n;++i){
lg[i]=lg[i>>1]+1;//这里
}
}
int main(){
cin>>n>>m;
LOG();
for(int i=1;i<=n;i++)cin>>f[i][0];
for(int j=1;j<=21;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
for(int i=1;i<=m;i++){
cin>>l>>r;
int LG=lg[r-l+1];
int ans=min(f[l][LG],f[r-(1<<LG)+1][LG]);
cout<<ans<<' ';
}
return 0;
}
```
by wanglexi @ 2023-12-06 20:28:15