-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSparseTable.cpp
More file actions
30 lines (25 loc) · 914 Bytes
/
SparseTable.cpp
File metadata and controls
30 lines (25 loc) · 914 Bytes
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
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = {5, 2, 4, 7, 6, 3, 1, 2};
vector<int> log_table(v.size() + 1, 0);
for (int i = 2; i < log_table.size(); i++)
log_table[i] = log_table[i/2] + 1;
vector<vector<int>> sparse_table(log_table.back() + 1, vector<int>(v.size()));
sparse_table[0] = v;
for (int row = 1; row < sparse_table.size(); row++) {
for (int i = 0; i + (1 << row) <= v.size(); i++) {
sparse_table[row][i] = min(sparse_table[row-1][i], sparse_table[row-1][i+(1<<(row-1))]);
}
}
while (1) {
int l, r;
cin >> l >> r;
// minimum of interval of indices [l, r)
// minimum of v[l], v[l+1], ... v[r-1]
int log = log_table[r - l];
int minimum = min(sparse_table[log][l], sparse_table[log][r - (1 << log)]);
cout << minimum << endl;
}
}