题目链接:
https://www.luogu.org/problemnew/show/P3865
st表:
倍增的思想
ST[i][j]维护i到i+2^j-1区间内的答案。
代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 5 using namespace std; 6 7 int n,m,dp[1000004][30],l,r; 8 9 void dpbegin() { 10 for(int j = 1;j <= 21; j++) 11 for(int i = 1;i + (1 << j) - 1 <= n; i++) 12 dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); 13 } 14 15 int main() 16 { 17 scanf("%d%d",&n,&m); 18 for(int i = 1;i <= n; i++) 19 scanf("%d",&dp[i][0]); 20 dpbegin(); 21 for(int i = 1;i <= m; i++) { 22 scanf("%d%d",&l,&r); 23 int k = log2(r-l+1); 24 printf("%d ",max(dp[l][k],dp[r-(1<<k)+1][k])); 25 } 26 return 0; 27 }