#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> sparseTable(vector<int> &arr) {
int n = arr.size();
// create the 2d table
vector<vector<int>> lookup(n + 1,
vector<int>(log2(n) + 1));
// Initialize for the intervals with length 1
for (int i = 0; i < n; i++)
lookup[i][0] = arr[i];
// Compute values from smaller to bigger intervals
for (int j = 1; (1 << j) <= n; j++) {
// Compute minimum value for all intervals with
// size 2^j
for (int i = 0; (i + (1 << j)) <= n; i++) {
if (lookup[i][j - 1] <
lookup[i + (1 << (j - 1))][j - 1])
lookup[i][j] = lookup[i][j - 1];
else
lookup[i][j] =
lookup[i + (1 << (j - 1))][j - 1];
}
}
return lookup;
}
vector<int> solveQueries(vector<int>& arr,
vector<vector<int>>& q) {
vector<vector<int>> lookup = sparseTable(arr);
vector<int> ans;
for(int i = 0; i < q.size(); i++) {
int j = log2(q[i][1] - q[i][0] + 1);
ans.push_back(min(lookup[q[i][0]][j], lookup[q[i][1] - (1 << j) + 1][j]));
}
return ans;
}
int main() {
vector<int> arr = { 7, 2, 3, 0, 5, 10, 3, 12, 18 };
vector<vector<int>> queries = { {0, 4}, {4, 7}, {7, 8} };
vector<int> res = solveQueries(arr, queries);
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8dmVjdG9yPGludD4+IHNwYXJzZVRhYmxlKHZlY3RvcjxpbnQ+ICZhcnIpIHsKCWludCBuID0gYXJyLnNpemUoKTsKCiAgICAvLyBjcmVhdGUgdGhlIDJkIHRhYmxlCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGxvb2t1cChuICsgMSwKICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+KGxvZzIobikgKyAxKSk7CgogICAgLy8gSW5pdGlhbGl6ZSBmb3IgdGhlIGludGVydmFscyB3aXRoIGxlbmd0aCAxCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICBsb29rdXBbaV1bMF0gPSBhcnJbaV07CgogICAgLy8gQ29tcHV0ZSB2YWx1ZXMgZnJvbSBzbWFsbGVyIHRvIGJpZ2dlciBpbnRlcnZhbHMKICAgIGZvciAoaW50IGogPSAxOyAoMSA8PCBqKSA8PSBuOyBqKyspIHsKCiAgICAgICAgLy8gQ29tcHV0ZSBtaW5pbXVtIHZhbHVlIGZvciBhbGwgaW50ZXJ2YWxzIHdpdGgKICAgICAgICAvLyBzaXplIDJeagogICAgICAgIGZvciAoaW50IGkgPSAwOyAoaSArICgxIDw8IGopKSA8PSBuOyBpKyspIHsKCiAgICAgICAgICAgIGlmIChsb29rdXBbaV1baiAtIDFdIDwgCiAgICAgICAgICAgICAgICBsb29rdXBbaSArICgxIDw8IChqIC0gMSkpXVtqIC0gMV0pCiAgICAgICAgICAgICAgICBsb29rdXBbaV1bal0gPSBsb29rdXBbaV1baiAtIDFdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBsb29rdXBbaV1bal0gPSAKICAgICAgICAgICAgICAgIGxvb2t1cFtpICsgKDEgPDwgKGogLSAxKSldW2ogLSAxXTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiBsb29rdXA7Cn0KdmVjdG9yPGludD4gc29sdmVRdWVyaWVzKHZlY3RvcjxpbnQ+JiBhcnIsIAogICAgICAgICAgICAgICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiYgcSkgewoJdmVjdG9yPHZlY3RvcjxpbnQ+PiBsb29rdXAgPSBzcGFyc2VUYWJsZShhcnIpOwoJdmVjdG9yPGludD4gYW5zOwoJCglmb3IoaW50IGkgPSAwOyBpIDwgcS5zaXplKCk7IGkrKykgewoJCWludCBqID0gbG9nMihxW2ldWzFdIC0gcVtpXVswXSArIDEpOwoJCWFucy5wdXNoX2JhY2sobWluKGxvb2t1cFtxW2ldWzBdXVtqXSwgbG9va3VwW3FbaV1bMV0gLSAoMSA8PCBqKSArIDFdW2pdKSk7Cgl9CglyZXR1cm4gYW5zOwp9CgppbnQgbWFpbigpIHsKICAgIHZlY3RvcjxpbnQ+IGFyciA9IHsgNywgMiwgMywgMCwgNSwgMTAsIDMsIDEyLCAxOCB9OwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBxdWVyaWVzID0geyB7MCwgNH0sIHs0LCA3fSwgezcsIDh9IH07CiAgICB2ZWN0b3I8aW50PiByZXMgPSBzb2x2ZVF1ZXJpZXMoYXJyLCBxdWVyaWVzKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgY291dCA8PCByZXNbaV0gPDwgIiAiOwogICAgfQogICAgcmV0dXJuIDA7Cn0=