#include <fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int aint[60005];
const int mx = 15000;
int answer;
void update(int nod, int st, int dr, int val, int zi, int modifier){
if (st == dr){
aint[nod] += modifier * val;
return;
}
int mid = (st + dr) / 2;
if (zi <= mid){
update(2 * nod, st, mid, val, zi, modifier);
} else {
update(2 * nod + 1, mid + 1, dr, val, zi, modifier);
}
aint[nod] = (aint[2 * nod] + aint[2 * nod + 1]);
}
void query(int nod, int st, int dr, int qst, int qdr){
if (st == dr || (qst <= st && dr <= qdr)){
answer += aint[nod];
return;
}
int mid = (st + dr) / 2;
if (qst <= mid){
query(2 * nod, st, mid, qst, qdr);
}
if (qdr > mid){
query(2 * nod + 1, mid + 1, dr, qst, qdr);
}
}
int main(){
int n, m;
fin >> n >> m;
for (int i = 1; i <= n; i++){
int x;
fin >> x;
update(1, 1, mx, x, i, 1);
}
for (int i = 1; i <= m; i++){
int qry, nr1, nr2;
fin >> qry >> nr1 >> nr2;
if (qry == 0){
update(1, 1, mx, nr2, nr1, -1);
} else {
answer = 0;
query(1, 1, mx, nr1, nr2);
fout << answer << '\n';
}
}
}