Skip to content

Commit 055871c

Browse files
committed
refine sparse table into struct
1 parent 042d1b4 commit 055871c

File tree

1 file changed

+32
-31
lines changed

1 file changed

+32
-31
lines changed

Sparse-Table/sparse_table.cpp

+32-31
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,45 @@
11
#include<bits/stdc++.h>
22
using namespace std;
33

4-
const int MAXN = 3*1e5 + 10;
5-
const int MAXP = log2(MAXN) + 10;
6-
int min_table[MAXP][MAXN];
7-
int a[MAXN];
8-
int numlog[MAXN];
9-
int n;
4+
struct RMQ {
5+
int n;
6+
vector<int> numlog;
7+
vector<vector<int>> min_table;
8+
RMQ(vector<int>& vals):n(vals.size()) {
9+
numlog = vector<int>(n+1);
10+
numlog[1] = 0;
11+
for(int i=2;i<=n;i++) numlog[i] = numlog[i/2] + 1;
1012

11-
12-
void init() {
13-
numlog[1] = 0;
14-
for(int i=2;i<=n;i++) numlog[i] = numlog[i/2] + 1;
15-
16-
for(int i=0;i<=numlog[n];i++) {
17-
int skiprange = 1<<i;
18-
for(int j=0;j+skiprange<=n;j++) {
19-
if(i==0) {
20-
min_table[i][j] = a[j];
21-
continue;
13+
min_table = vector<vector<int>>(numlog[n]+1, vector<int>(n+1));
14+
for(int i=0;i<=numlog[n];i++) {
15+
int skiprange = 1<<i;
16+
for(int j=0;j+skiprange<=n;j++) {
17+
if(i==0) {
18+
min_table[i][j] = vals[j];
19+
continue;
20+
}
21+
min_table[i][j] = operate(min_table[i-1][j], min_table[i-1][j+(skiprange>>1)]);
2222
}
23-
min_table[i][j] = min(min_table[i-1][j], min_table[i-1][j+(skiprange>>1)]);
2423
}
2524
}
26-
}
2725

28-
int query(int low, int high) {
29-
int range = high-low+1;
30-
int p = numlog[range];
31-
int mn = min(min_table[p][low], min_table[p][high-(1<<p)+1]);
32-
return mn;
33-
}
26+
int query(int low, int high) {
27+
int range = high-low+1;
28+
int p = numlog[range];
29+
int mn = operate(min_table[p][low], min_table[p][high-(1<<p)+1]);
30+
return mn;
31+
}
32+
33+
int operate(int a, int b) {
34+
return min(a, b);
35+
}
36+
};
3437

3538

3639
int main() {
3740
vector<int> tmp = {4,3,2,1};
38-
n = tmp.size();
39-
copy(tmp.begin(), tmp.end(), a);
40-
init();
41-
cout << query(0, 3) << "\n"; // 1
42-
cout << query(0, 1) << "\n"; // 3
43-
cout << query(1, 2) << "\n"; // 2
41+
RMQ rmq(tmp);
42+
cout << rmq.query(0, 3) << "\n"; // 1
43+
cout << rmq.query(0, 1) << "\n"; // 3
44+
cout << rmq.query(1, 2) << "\n"; // 2
4445
}

0 commit comments

Comments
 (0)