#include <stdio.h>
#include <algorithm>
using namespace std;
struct node {
int l;
int r;
int wz;
bool operator<(node b) const {
return r < b.r;
}
};
node nn[524288];
int n, q;
int a[524288];
int c[524288];
void inc(int wz, int val) {
for (int i = wz; i <= n; i += (i & (-i))) {
c[i] += val;
}
}
int query(int wz) {
int ans = 0;
for (int i = wz; i > 0; i -= (i & (-i))) {
ans += c[i];
}
return ans;
}
// 差分第k大
int find(int x) {
int now = 0;
int val = 0;
for (int i = 20; i >= 0; i--) {
if ((now + (1 << i)) > n) {
continue;
}
if (val + c[now + (1 << i)] >= x) {
val += c[now + (1 << i)];
now += (1 << i);
}
}
return now;
}
int ans[524288];
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < q; i++) {
int x, y;
scanf("%d%d", &x, &y);
nn[i].l = x + 1;
nn[i].r = n - y;
nn[i].wz = i;
}
sort(nn, nn + q);
int now = 0;
for (int i = 0; i < q; i++) {
while (now < nn[i].r) {
now++;
if (a[now] == now) {
inc(1, 1);
inc(now + 1, -1);
}
if (a[now] < now) {
int l = find(now - a[now]);
inc(1, 1);
inc(l + 1, -1);
}
}
ans[nn[i].wz] = query(nn[i].l);
}
for (int i = 0; i < q; i++) {
printf("%d\n", ans[i]);
}
return 0;
}