思路:
ST表模板题
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> using namespace std; const int maxn = 50010; inline void qread(int &x){ x = 0; register int ch = getchar(), flag = 0; while(ch < '0' || ch > '9') { if(ch == '-') flag = 1; ch =getchar(); } while(ch >='0' && ch <='9'){ x = 10 * x + ch - 48; ch = getchar(); } if(flag) x = -x; } int n, m; int llog[maxn]; int f[maxn][25]; int g[maxn][25]; int main(void) { qread(n); qread(m); for(int i=1; i<=n; ++i) qread(f[i][0]); for(int i=1; i<=n; ++i) g[i][0] = f[i][0]; for(int i=2; i<=n; ++i) llog[i] = llog[i/2] + 1; for(int j=1; j<=llog[n]; ++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]); g[i][j] = min(g[i][j-1], g[i + (1 << (j-1))][j-1]); } while(m--){ int a, b; qread(a), qread(b); int t = llog[b - a + 1]; printf("%d\n", max(f[a][t], f[b - (1 << t) + 1][t]) - min(g[a][t], g[b - (1 << t) + 1][t])); } }