#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
using namespace std;
const int N = 4e5 + 7;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
int n, m, tot, h[N], hs[N], dp[2][N], stk[N], cnt[N], LIS;
bool is[N];
struct ChairmanTree {
struct node {
int mx, l, r;
} a[N * 20];
int tot, root[N];
void update(int p, int val, int l, int r, int &x, int y) {
x = ++tot; a[x] = a[y];
a[x].mx = max(a[x].mx, val);
if(l == r) return ;
int mid = l + r >> 1;
if(p <= mid) update(p, val, l, mid, a[x].l, a[y].l);
else update(p, val, mid + 1, r, a[x].r, a[y].r);
}
int query(int L, int R, int l, int r, int x) {
if(hs[r] < L || hs[l] > R) return 0;
if(hs[l] >= L && hs[r] <= R) return a[x].mx;
int ans = 0, mid = l + r >> 1;
if(L <= hs[mid]) ans = query(L, R, l, mid, a[x].l);
if(R > hs[mid]) ans = max(ans, query(L, R, mid + 1, r, a[x].r));
return ans;
}
}ct[2];
void getLIS() {
memset(stk, inf, sizeof(stk));
for(int i = 1; i <= n; i++) {
dp[0][i] = lower_bound(stk, stk + N, h[i]) - stk + 1;
stk[dp[0][i] - 1] = h[i];
LIS = max(LIS, dp[0][i]);
}
memset(stk, inf, sizeof(stk));
for(int i = n; i >= 1; i--) {
dp[1][i] = lower_bound(stk, stk + N, -h[i]) - stk + 1;
stk[dp[1][i] - 1] = -h[i];
}
for(int i = 1; i <= n; i++) {
if(dp[0][i] + dp[1][i] == LIS + 1) {
is[i] = true;
cnt[dp[0][i]]++;
}
}
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
scanf("%d", &h[i]);
hs[++tot] = h[i];
}
sort(hs + 1, hs + 1 + tot);
tot = unique(hs + 1, hs + 1 + tot) - hs - 1;
for(int i = 1; i <= n; i++)
h[i] = lower_bound(hs + 1, hs + 1 + tot, h[i]) - hs;
getLIS();
for(int i = 1; i <= n; i++)
ct[0].update(h[i], dp[0][i], 1, tot, ct[0].root[i], ct[0].root[i-1]);
for(int i = n; i >= 1; i--)
ct[1].update(h[i], dp[1][i], 1, tot, ct[1].root[i], ct[1].root[i+1]);
while(m--) {
int a, b;
scanf("%d%d", &a, &b);
int ans = is[a] ? LIS - 1 : LIS;
ans = max(ans, ct[0].query(1, b - 1, 1, tot, ct[0].root[a-1])
+ ct[1].query(b + 1, inf, 1, tot, ct[1].root[a+1]) + 1);
if(is[a] && cnt[dp[0][a]] > 1) {
ans = max(ans, LIS);
}
printf("%d\n", ans);
}
return 0;
}
/*
*/