#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, q;
if (!(cin >> n >> q)) return 0;
vector<int> p(n + 1);
for (int i = 1; i <= n; i++) {
cin >> p[i];
}
vector<int> start_blk, end_blk;
int i = 1;
while (i <= n) {
int s = i;
while (i < n && p[i] > p[i+1]) {
i++;
}
start_blk.push_back(s);
end_blk.push_back(i);
i++;
}
int K = start_blk.size();
vector<vector<int>> up(n + 1, vector<int>(20, 0));
vector<vector<int>> cost(n + 1, vector<int>(20, 0));
for (int k = 0; k < K - 1; k++) {
int nxt_s = start_blk[k+1];
int nxt_e = end_blk[k+1];
int max_nxt = p[nxt_s];
int min_prev = p[end_blk[k]];
for (int j = start_blk[k]; j <= end_blk[k]; j++) {
int v = p[j];
if (max_nxt > v) {
cost[j][0] = 1;
int low = nxt_s, high = nxt_e, ans = -1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (p[mid] > v) {
ans = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
up[j][0] = ans;
} else {
cost[j][0] = 2;
int low = nxt_s, high = nxt_e, ans = -1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (p[mid] > min_prev) {
ans = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
up[j][0] = ans;
}
}
}
for (int j = start_blk[K-1]; j <= end_blk[K-1]; j++) {
up[j][0] = j;
cost[j][0] = 0;
}
for (int step = 1; step < 20; step++) {
for (int j = 1; j <= n; j++) {
up[j][step] = up[up[j][step-1]][step-1];
cost[j][step] = cost[j][step-1] + cost[up[j][step-1]][step-1];
}
}
vector<int> pref_inc(n + 1, 0);
for (int j = 1; j < n; j++) {
pref_inc[j] = pref_inc[j-1] + (p[j] < p[j+1] ? 1 : 0);
}
pref_inc[n] = pref_inc[n-1];
vector<int> next_inc(n + 2, n + 1);
for (int j = n - 1; j >= 1; j--) {
if (p[j] < p[j+1]) {
next_inc[j] = j;
} else {
next_inc[j] = next_inc[j+1];
}
}
for (int idx = 0; idx < q; idx++) {
int l, r;
cin >> l >> r;
if (l == r) {
cout << 1 << "\n";
continue;
}
int M = pref_inc[r-1] - pref_inc[l-1];
if (M == 0) {
cout << 1 << "\n";
continue;
}
int u = next_inc[l];
long long ans_jumps = 0;
int jumps_needed = M;
for (int step = 19; step >= 0; step--) {
if (jumps_needed >= (1 << step)) {
ans_jumps += cost[u][step];
u = up[u][step];
jumps_needed -= (1 << step);
}
}
cout << 1 + ans_jumps << "\n";
}
return 0;
}