0%

st表

st表

询问特定区间的最大/最小值

先进行初始化,每次询问的复杂度为O(1)

询问区间的极差(最大值-最小值)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
* @Description:
* @Author: CrayonXiaoxin
* @Date: 2024-01-26 10:46:31
* @LastEditTime: 2024-05-22 20:53:39
* @LastEditors:
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
const int maxn = 1e6 + 10;
int n, m;
ll max_xy[maxn][22], min_xy[maxn][22];

ll st(int l,int r)
{
int s = log2(r - l + 1), x, y;
x = max(max_xy[l][s], max_xy[r - (1 << s) + 1][s]);//区间最大
y = min(min_xy[l][s], min_xy[r - (1 << s) + 1][s]);//区间最小
return x - y;
}
void solve(){
cin >> n >> m;
for (int i = 1; i <= n;++i)
{
cin >> max_xy[i][0];
min_xy[i][0] = max_xy[i][0];
}

for (int i = 1; i <= 21;++i)//这个循环的上界决定于数据的大小,即2的21次方大于数据
{
for (int k = 1; k + (1 << i) <= n + 1;++k)
{
max_xy[k][i] = max(max_xy[k][i - 1], max_xy[k + (1 << (i - 1))][i - 1]);
min_xy[k][i] = min(min_xy[k][i - 1], min_xy[k + (1 << (i - 1))][i - 1]);
}
}

while(m--)
{
int l, r;
cin >> l >> r;
cout << st(l, r) << endl;
}
}

int main(){
//std::ios::sync_with_stdio(false);
//cin.tie(0);
//cout.tie(0);
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}