Given a array containing N integers, answer Q queries asking maximum element in the array lying within offset A and B.
Example:
Array = [8, 5, 3, 4, 7, 1, 9, 2, 6]
A = 1, B = 5 (0 based offset)
Then the subarray between A to B is [5, 3, 4, 7, 1] and the answer is 7.
You can study how to construct sparse table in this tutorial.
Defining entries in sparse table - ST[i][j] = maximum element in range [i, i+2j]
The Sparse Table for above array will look like-
Once this table (call it ST) is constructed in O(n log n) time, you can answer queries in O(1) time.
Like for A=1, B=5 -
- First find the log base 2 of length of sub array. And subtract one from it. That is log(B-A+1) - 1 = log(5 - 1 + 1) - 1= 3 - 1 = 2. Let this quantity be L.
- Answer is simply maximum of ST[A][L], ST[B-2L][L]
#include <cstdio> #include <vector> #include <algorithm> using namespace std; typedef long long ll; vector< int > v; vector< vector< int > > st; int log2(int x) { int i=0; while (x){ x>>=1; i++; } return i; } void constructsparsetable(int n) { int c = log2(n); st = vector< vector< int > >(n, vector< int >(c)); //Initialize for (int i = 0; i < n; i++){ st[i][0] = v[i]; } for (int i = 1; i < c; i++){ for (int j = 0; j < (n - (1<<(i-1))); j++){ st[j][i] = max(st[j][i-1], st[j+(1<<(i-1))][i-1]); } } } int querysparsetable(int a, int b) { int l = log2(b - a + 1); return max(st[a][l-1], st[b-(1<<(l-1))][l-1]); } int main() { int n, m, h, a, b; scanf("%d %d", &n, &m); v.reserve(n); for (int i = 0; i < n; i++){ scanf("%d", &h); v.push_back(h); } constructsparsetable(n); int c = 0; for (int i = 0; i < m; i++){ scanf("%d %d", &a, &b); if (querysparsetable(a, b-2) <= v[a-1]) c++; } printf("%d\n", c); }