1 条题解
-
1
#include <bits/stdc++.h> using namespace std; const int N = 2e5+10; int n,m,t; int f[N][21],g[N][21]; int a[N]; inline void read(int &x) { x = 0;int f = 1;char c = getchar(); while(!isdigit(c)) {if(c == '-')f = -1;c = getchar();} while(isdigit(c)) {x = (x<<1)+(x<<3)+(c^48);c = getchar();} } void ST_init_f() { for(int i=1;i<=n;i++) f[i][0] = a[i]; int t = log(n)/log(2)+1; for(int j=1;j<t;j++) for(int i=1;i<=n-(1<<j)+1;i++) f[i][j] = max(f[i][j-1],f[i+(1<<(j-1))][j-1]); } void ST_init_g() { for(int i=1;i<=n;i++) g[i][0] = a[i]; int t = log(n)/log(2)+1; for(int j=1;j<t;j++) for(int i=1;i<=n-(1<<j)+1;i++) g[i][j] = min(g[i][j-1],g[i+(1<<(j-1))][j-1]); } int query_f(int l,int r) { int k = log(r-l+1)/log(2); return max(f[l][k],f[r-(1<<k)+1][k]); } int query_g(int l,int r) { int k = log(r-l+1)/log(2); return min(g[l][k],g[r-(1<<k)+1][k]); } int main() { read(n);read(m); for(int i=1;i<=n;i++) cin >> a[i]; ST_init_f(); ST_init_g(); for(int i=1;i<=m;i++) { int x,y; cin >> x >> y; cout << query_f(x,y) - query_g(x,y) << endl; } return 0; }
- 1
信息
- ID
- 602
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 4
- 上传者