func_code_string: #include <bits/stdc++.h>   using namespace std;   const int LIM = 200 * 1000, MAXN = 300 * 1000;   int fen[MAXN];   void add(int pos, int val) {     pos++;     while (pos < MAXN) {       fen[pos] += val;       pos += pos & -pos;     }   }   int sum(int pos) {     pos++;     int tot = 0;     while (pos) {       tot += fen[pos];       pos -= pos & -pos;     }     return tot;   }   bool by_id(pair<pair<int, int>, pair<int, int> > a,              pair<pair<int, int>, pair<int, int> > b) {     return a.second.first < b.second.first;   }   vector<int> occ[MAXN];   int pt[MAXN], a[MAXN], n, q;   pair<pair<int, int>, pair<int, int> > seg[MAXN];   int main() {     cin >> n >> q;     for (int i = 0; i < int(n); i++) {       cin >> a[i];       if (a[i] < LIM) occ[a[i]].push_back(i);     }     for (int i = 1; i < int(LIM); i++)       if (i <= (int((occ[i]).size()))) {         pt[i] = i - 1;         add(occ[i][pt[i]], 1);         if (pt[i] + 1 < (int((occ[i]).size()))) add(occ[i][pt[i] + 1], -1);       } else         pt[i] = (int((occ[i]).size()));     cerr <<  Salam :)  << endl;     for (int i = 0; i < int(q); i++) {       seg[i].second.first = i;       cin >> seg[i].first.first >> seg[i].first.second;       seg[i].first.first--;       seg[i].first.second--;     }     sort(seg, seg + q);     int cur = 0;     for (int i = 0; i < int(n); i++) {       while (cur < q && seg[cur].first.first == i) {         seg[cur].second.second = sum(seg[cur].first.second);         cur++;       }       int x = a[i];       if (x < LIM && pt[x] < (int((occ[x]).size()))) {         add(occ[x][pt[x]], -1);         if (pt[x] + 1 < (int((occ[x]).size()))) add(occ[x][pt[x] + 1], +1);         pt[x]++;         if (pt[x] < (int((occ[x]).size()))) {           add(occ[x][pt[x]], 1);           if (pt[x] + 1 < (int((occ[x]).size()))) add(occ[x][pt[x] + 1], -1);         }       }     }     sort(seg, seg + q, by_id);     for (int i = 0; i < int(q); i++) cout << seg[i].second.second << endl;     return 0;   }   