int lg[N], f[N][19];
void init(){
lg[1] = 0, lg[2] = 1;
for(int i = 3;i < N;i ++ )
lg[i] = lg[i >> 1] + 1;
}
void ST_prework(){
for(int i = 1;i <= n;i ++ ) f[i][0] = a[i];
for(int j = 1;j <= 18;j ++ )
for(int i = 1;i + (1 << j) - 1 <= n;i ++ )
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
int ST_query(int l,int r){
int k = lg[r - l + 1];
return max(f[l][k], f[r - (1 << k) + 1][k]);
}
越界了吧 f的第二维最多到18 st表初始化中f第二维用到了19
已改
ST_query()函数是不是写错了,应该不用除2吧
这里是左移哦
我说的是求k的值不用将区间长度除2
是的,谢谢指正
X:D