Link to this code: https://cses.fi/paste/00db844c15279cbecc2f4f/
#include <bits/stdc++.h>
using namespace std;

#define repeat(i,n) for(int i = 0 ; i < n ; i++)
#define repeat_range(i,a,n) for(int i = a ; i < n ; i++)
#define PB push_back
#define F first
#define S second
#define max_ll(a,b) ((a) > (b) ? (a) : (b))
#define min_ll(a,b) ((a) < (b) ? (a) : (b))

typedef long long ll;
typedef pair<int,int> pii;
const int INF = 1e9 ; 
const int MOD = 1e9+7;

int main() {
    int n , q ; 
    cin >> n >> q; 
    vector<int> arr(n) ; 
    repeat(i,n)
        cin >> arr[i];

    vector<int> ngg(n) ; 

    stack<pair<int,int>> s ; 
    ngg[n-1] = INF ; 
    s.push({arr[n-1],n-1}) ; 
    for(int i = n-2 ; i>=0 ; i--){
        while(!s.empty () && s.top().first <= arr[i])
            s.pop() ; 
        if(!s.empty())
            ngg[i] = s.top().second ; 
        else 
            ngg[i] = INF ; 
        s.push({arr[i],i}) ; 
    }
    
    // Binary - lifting 
    int k = 32 ;
    vector<vector<int>> dp(k+1,vector<int>(n)) ;

    for(int i = 0 ; i<n ; i++)
        dp[0][i] = ngg[i] ; 

    for(int i = 1 ; i<=k ; i++)
        for(int j = 0 ; j<n ; j++){
            if(dp[i-1][j] == INF)
                dp[i][j] = INF ; 
            else
                dp[i][j] = dp[i-1][dp[i-1][j]] ; // 4 1 2 2 3
        }

    repeat(i,q){
        int a , b ; cin >> a >> b ; a-- ; b-- ; 
        int s = 0 , e = b-a+1 , ans = 1 ; // Possible value of the answer
        while(s<=e){
            int m = (s+e)/2 , idx = a , curr = 1 ;
            for(int i = 0 ; (1<<i) <= m ; i++){
                if((1<<i)&m){
                    idx = dp[i][idx];
                    if(idx == INF || idx > b)
                        break ; 
                    else 
                        curr += (1<<i) ; 
                }
            }
            if(curr < m)
                e = m-1 ; 
            else{
                s = m+1 ; 
                ans = max(ans,curr) ;
            }
        }
        cout << ans << endl ; 
    }

    return 0;
}