Library/Data Structures/sparse_table.cpp

20 lines
539 B
C++
Raw Normal View History

2019-08-03 02:47:29 +00:00
template< typename T > class sparse_table {
private: vector<T> st[20];
2019-08-02 15:53:39 +00:00
public:
int log(int x) { return 32 - __builtin_clz(x) - 1; }
2019-08-03 02:47:29 +00:00
sparse_table(vector<T> &A) {
int N = A.size();
for (int i = 0; i <= log(N); i++) st[i].resize(N);
2019-08-03 03:03:09 +00:00
for (int i = 0; i < N; i++) st[0][i] = A[i];
for (int i = 1; i <= log(N); i++) {
for (int j = 0; j + (1 << i) < N; j++) st[i][j] = min(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
2019-08-02 15:53:39 +00:00
}
}
2019-08-03 02:47:29 +00:00
T query(int i, int j) {
2019-08-02 15:53:39 +00:00
int k = log(j - i + 1);
return min(st[k][i], st[k][j - (1 << k) + 1]);
}
};