blob: b38b83862513c14c7f6610c51d1ce0e978780660 (
plain)
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
|
vector<int> values;
vector<vector<int>> rmq;
int select(int a, int b) {
return values[a] <= values[b] ? a : b;
}
void build() {
for(int i = 0, s = 1, ss = 1; s <= values.size(); ss=s, s*=2, i++) {
for(int l = 0; l + s <= values.size(); l++) {
if(i == 0) rmq[0][l] = l;
else {
int r = l + ss;
rmq[i][l] = select(rmq[i-1][l], rmq[i-1][r]]);
}}}}
void init(vector<int>& v) {
values = v;
rmq = vector<vector<int>>(floor(log2(values.size()))+1, vector<int>(values.size()));
build();
}
int query(int l, int r) {
if(l >= r) return l;
int s = floor(log2(r-l)); r = r - (1 << s);
return select(rmq[s][l],rmq[s][r]);
}
|