首先你st数组中两个变量的位置都反了,把每一个的i和j的部分交换就行。然后输入输出要用scanf和printf或者快读快写,因为这题时间只有0.8s
by liuzr156 @ 2023-01-09 20:25:23
@[dengjiaqiang](/user/638718)
~~好像还是要用快读~~
```cpp
#include <iostream>
#include <cstdio>
#include <cmath>
#define int unsigned long long
using namespace std;
const int N=1e5+10;
int st[N][25],a[N],n,m,lg[N];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void ST() {
for(int i = 1; i<=n; i++)st[i][0] = a[i];
int p = log(n)/log(2);
for(int k = 1; k<=p; k++) {
for(int i = 1; i<=n-(1<<k)+1; i++) {
st[i][k] = max(st[i][k-1],st[i+(1<<(k-1))][k-1]);
}
}
}
int query(int l,int r) {
int p = lg[r-l+1];
return max(st[l][p],st[r-(1<<p)+1][p]);
}
signed main() {
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
ST();
while(m--){
int l,r;
l=read(),r=read();
printf("%d\n",query(l,r));
}
return 0;
}
```
by liuzr156 @ 2023-01-09 20:32:30
@[dengjiaqiang](/user/638718) 我的建议是去写策略游戏![](//图.tk/0)
by Light_az @ 2023-01-09 20:56:06
屑屑你
by xueruo @ 2023-01-09 20:58:19