query函数不知道为什么就RE了
#include <iostream>
#include <cstdio>
typedef long long ll;
typedef double lf;
using namespace std;
const int INF = 1e9+7;
const int maxn = 1e5+5;
const int maxk = 25;
int n, m;
int a[maxn];
int st[maxn][maxk];
int l, r;
void buildST(){
for (int i = 1; i <= n; i++)
st[i][0] = a[i];
for (int j = 1; (1<<j) <= n; j++)
for (int i = 1; i+(1<<j)-1 <= n; i++)
st[i][j] = max(st[i][j-1], st[i+(1<<(j-1))][j-1]);
}
//RE
int query(int l, int r){
int len = r-l+1;
int k = maxk;
while((1<<k) >= len)
k--;
return max(st[l][k], st[r-(1<<k)+1][k]);
}
int main(){
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
buildST();
for (int i = 1; i <= m; i++){
scanf("%d %d", &l, &r);
printf("%d\n", query(l, r));
}
return 0;
}
改成:
int query(int l, int r){
int len = r-l+1;
int k = 0;
while((1<<(k+1)) <= len)
k++;
return max(st[l][k], st[r-(1<<k)+1][k]);
}
就不RE了??? 哪位大佬能帮我解释一下TAT