Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct ST {
- vector<vector<int>> st;
- vector<int> pow;
- ST () {}
- ST (vector<int>& v) {
- int k = 0;
- while ((1<<k) <= sz (v)) ++k;
- pow = vector<int> (sz (v) + 1);
- st = vector<vector<int>> (k, (vector<int> (sz (v))));
- int tmp = 0;
- fr (i, sz (v)) {
- st[0][i] = v[i];
- if ((1<<(tmp + 1)) <= i) ++tmp;
- pow[i] = tmp;
- }
- pow[sz (v)] = k - 1;
- fl (j, 1, k) {
- fr (i, sz (v)) {
- if (i + (1<<(j - 1)) >= sz (v)) continue;
- st[j][i] = min (st[j - 1][i], st[j - 1][i + (1<<(j - 1))]);
- }
- }
- }
- int get (int i, int j) {
- if (i > j) swap (i, j);
- int k = pow[j - i + 1];
- return min (st[k][i], st[k][j - (1<<k) + 1]);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement