Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define MAXN 100000
- #define MAXLOGN 18
- int high_bit(int v){
- for(int i = MAXLOGN; i >= 0; i--)
- if(v & (1 << i))return i;
- return 0;
- }
- struct sparse_table{
- int maxVal[MAXN][MAXLOGN];
- void init(int *val, int n){
- for(int i = 0; i < n; i++){
- maxVal[i][0] = val[i];
- }
- for(int i = n-1; i >= 0; i--){
- for(int j = 1; (j < MAXLOGN) and (i + (1 << j)) < n; j++){
- maxVal[i][j] = max(
- maxVal[i][j - 1],
- maxVal[i + (1 << (j - 1))][j - 1]
- );
- }
- }
- }
- //(), 0-base
- int query(int l, int r){
- int hb = high_bit(r - l + 1);
- return max(maxVal[l][hb], maxVal[r - (1 << hb) + 1][hb]);
- }
- };
- int main(){
- int n, m;
- cin >> n >> m;
- int val[n];
- for(int i = 0; i < n; i++){
- cin >> val[i];
- }
- sparse_table st;
- st.init(val, n);
- int l, r;
- for(int i = 0; i < m; i++){
- cin >> l >> r;
- cout << st.query(l-1, r-1) << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement