-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpoj3264.cpp
More file actions
51 lines (40 loc) · 1.13 KB
/
poj3264.cpp
File metadata and controls
51 lines (40 loc) · 1.13 KB
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
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAXN 50010
int cows[MAXN];
int st_min[MAXN][20], st_max[MAXN][20];
//http://noalgo.info/489.html
void initRMQ(int N) {
for(int i = 0; i < N; ++i)
st_max[i][0] = st_min[i][0] = cows[i];
for(int j = 1; (1 << j) <= N; ++j)
for(int i = 0; i + (1 << j) - 1< N; ++i) {
st_max[i][j] = max(st_max[i][j-1], st_max[i+(1<<(j-1))][j-1]);
st_min[i][j] = min(st_min[i][j-1], st_min[i+(1<<(j-1))][j-1]);
}
}
int RMQ_max(int u, int v) {
int k = log2(v - u + 1);
return max(st_max[u][k], st_max[v-(1<<k)+1][k]);
}
int RMQ_min(int u, int v) {
int k = log2(v - u + 1);
return min(st_min[u][k], st_min[v-(1<<k)+1][k]);
}
int main() {
// freopen("input.txt", "r", stdin);
int N, Q;
int A, B;
while(scanf("%d%d", &N, &Q) != EOF) {
for(int i = 0; i < N; ++i) scanf("%d", &cows[i]);
initRMQ(N);
for(int i = 0; i < Q; ++i) {
scanf("%d%d", &A, &B);
printf("%d\n", RMQ_max(A-1, B-1) - RMQ_min(A-1, B-1));
}
}
return 0;
}