#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, ch[2];
  int mi, cnt;
  int add;
};
stack<int> tars;
node a[700010];
int sth[300010];
int cnt, sss;
struct ques {
  int l, r, loc;
  bool operator<(const ques &a) const { return l > a.l; }
};
ques q[300010];
inline void update(int k) {
  a[k].mi = min(a[a[k].ch[0]].mi, a[a[k].ch[1]].mi);
  a[k].cnt = a[a[k].ch[0]].cnt + a[a[k].ch[1]].cnt;
}
inline void pushdown(int k) {
  if (a[k].ch[0]) a[a[k].ch[0]].add += a[k].add, a[a[k].ch[0]].mi += a[k].add;
  if (a[k].ch[1]) a[a[k].ch[1]].add += a[k].add, a[a[k].ch[1]].mi += a[k].add;
  a[k].add = 0;
}
void build(int &k, int l, int r) {
  k = ++cnt;
  a[k].l = l, a[k].r = r;
  if (l == r) {
    a[k].mi = 0x3f3f3f3f;
    return;
  }
  int mid = l + r >> 1;
  build(a[k].ch[0], l, mid), build(a[k].ch[1], mid + 1, r);
  update(k);
}
void change(int k, int tar) {
  if (a[k].l == a[k].r) return a[k].mi = sth[tar], void();
  int mid = a[k].l + a[k].r >> 1;
  if (tar <= mid)
    change(a[k].ch[0], tar);
  else
    change(a[k].ch[1], tar);
  update(k);
}
void add(int k, int l, int r) {
  if (a[k].l == l && a[k].r == r) {
    a[k].add--, a[k].mi--;
    return;
  }
  pushdown(k);
  int mid = a[k].l + a[k].r >> 1;
  if (r <= mid)
    add(a[k].ch[0], l, r);
  else if (l > mid)
    add(a[k].ch[1], l, r);
  else
    add(a[k].ch[0], l, mid), add(a[k].ch[1], mid + 1, r);
  update(k);
}
void force(int k) {
  if (a[k].l == a[k].r) {
    if (a[k].cnt) return;
    tars.push(a[k].l);
    a[k].mi = 0x3f3f3f3f, a[k].cnt = 1;
    return;
  }
  pushdown(k);
  if (a[a[k].ch[0]].mi <= 0) force(a[k].ch[0]);
  if (a[a[k].ch[1]].mi <= 0) force(a[k].ch[1]);
  update(k);
}
int query(int k, int l, int r) {
  if (l == a[k].l && r == a[k].r) return a[k].cnt;
  pushdown(k);
  int mid = a[k].l + a[k].r >> 1;
  if (r <= mid)
    return query(a[k].ch[0], l, r);
  else if (l > mid)
    return query(a[k].ch[1], l, r);
  else
    return query(a[k].ch[0], l, mid) + query(a[k].ch[1], mid + 1, r);
}
void prit(int k) {
  if (a[k].ch[0]) prit(a[k].ch[0]);
  if (a[k].ch[1]) prit(a[k].ch[1]);
}
int n, Q;
void gogogo() {
  force(1);
  while (!tars.empty()) {
    int nw = tars.top();
    tars.pop();
    add(1, nw, n);
    force(1);
  }
}
int op[300010];
int main() {
  a[0].mi = 0x3f3f3f3f;
  scanf("%d%d", &n, &Q);
  int nloc = n;
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &sth[i]);
    sth[i] = i - sth[i];
    if (sth[i] < 0) sth[i] = 0x3f3f3f3f;
  }
  build(sss, 1, n);
  for (int i = 1; i <= Q; ++i) {
    scanf("%d%d", &q[i].l, &q[i].r);
    q[i].l++, q[i].r = n - q[i].r;
    q[i].loc = i;
  }
  sort(q + 1, q + Q + 1);
  for (int i = 1; i <= Q; ++i) {
    while (nloc >= q[i].l) change(1, nloc), nloc--;
    gogogo();
    op[q[i].loc] = query(1, q[i].l, q[i].r);
  }
  for (int i = 1; i <= Q; ++i) printf("%d\n", op[i]);
  return 0;
}
