1. 程式人生 > 其它 >Balanced Lineup

Balanced Lineup

題目連結:https://www.luogu.com.cn/problem/P2880

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=5e4+10;
 6 int n, q, h[maxn];
 7 int a, b;
 8 int f[maxn][21], g[maxn][21];
 9 int maxh, minh;
10 void st_create(int n)
11 {
12     int k=log2(n);
13 for(int j=1; j<=k; j++) 14 { 15 for(int i=1; i+(1<<j)-1<=n; i++) 16 { 17 f[i][j]=max(f[i][j-1], f[i+(1<<(j-1))][j-1]); 18 g[i][j]=min(g[i][j-1], g[i+(1<<(j-1))][j-1]); 19 } 20 } 21 } 22 int st_max(int l, int r) 23 {
24 int k=log2(r-l+1); 25 return max(f[a][k], f[b-(1<<k)+1][k]); 26 } 27 int st_min(int l, int r) 28 { 29 int k=log2(r-l+1); 30 return min(g[a][k], g[b-(1<<k)+1][k]); 31 } 32 int main() 33 { 34 scanf("%d%d", &n, &q); 35 for(int i=1; i<=n; i++) 36 { 37
scanf("%d", &h[i]); 38 f[i][0]=g[i][0]=h[i]; 39 } 40 st_create(n); 41 while(q--) 42 { 43 scanf("%d%d", &a, &b); 44 maxh=st_max(a, b); 45 minh=st_min(a, b); 46 printf("%d\n", maxh-minh); 47 } 48 49 return 0; 50 }