#include <bits/stdc++.h>   using namespace std;   long long blockSize;   long long cnt[100005];   long long ans[100005];   struct Query {     long long L, R, idx;   };   bool compare(Query x, Query y) {     if (x.L / blockSize != y.L / blockSize)       return x.L / blockSize < y.L / blockSize;     return x.R < y.R;   }   void queryResults(long long a[], long long n, Query q[], long long m) {     blockSize = (long long)sqrt(n);     sort(q, q + m, compare);     long long currL = 0, currR = 0;     long long currCnt = 0;     for (long long i = 0; i < m; i++) {       long long L = q[i].L, R = q[i].R;       while (currL < L) {         if (a[currL] > 100000) {           currL++;           continue;         }         if (cnt[a[currL]] == a[currL]) currCnt--;         cnt[a[currL]]--;         if (cnt[a[currL]] == a[currL]) currCnt++;         currL++;       }       while (currL > L) {         if (a[currL - 1] > 100000) {           currL--;           continue;         }         if (cnt[a[currL - 1]] == a[currL - 1]) currCnt--;         cnt[a[currL - 1]]++;         if (cnt[a[currL - 1]] == a[currL - 1]) currCnt++;         currL--;       }       while (currR <= R) {         if (a[currR] > 100000) {           currR++;           continue;         }         if (cnt[a[currR]] == a[currR]) currCnt--;         cnt[a[currR]]++;         if (cnt[a[currR]] == a[currR]) currCnt++;         currR++;       }       while (currR > R + 1) {         if (a[currR - 1] > 100000) {           currR--;           continue;         }         if (cnt[a[currR - 1]] == a[currR - 1]) currCnt--;         cnt[a[currR - 1]]--;         if (cnt[a[currR - 1]] == a[currR - 1]) currCnt++;         currR--;       }       ans[q[i].idx] = currCnt;     }     for (long long i = 0; i < m; i++) cout << ans[i] << endl;   }   int main() {     long long n, m;     cin >> n >> m;     long long a[n];     for (long long i = 0; i < n; i++) cin >> a[i];     Query q[m];     for (long long i = 0; i < m; i++) {       cin >> q[i].L >> q[i].R;       q[i].L--;       q[i].R--;       q[i].idx = i;     }     queryResults(a, n, q, m);     return 0;   }   