#include <stdio.h>
#define MAX 32768
int suma[MAX];
void update(int nod, int left, int right, int val, int pos, int operatie) {
if (left == right) {
suma[nod] += (val * operatie);
return;
}
int mid = (left + right) / 2;
if (mid >= pos) {
update(2 * nod, left, mid, val, pos, operatie);
}
else {
update(2 * nod + 1, mid + 1, right, val, pos, operatie);
}
suma[nod] = suma[2 * nod] + suma[2 * nod + 1];
}
int query(int nod, int left, int right, const int start, const int stop) {
if (left >= start && right <= stop) {
return suma[nod];
}
int a = 0, b = 0;
int mid = (left + right) / 2;
if (start <= mid) {
a = query(2 * nod, left, mid, start, stop);
}
if (mid < stop) {
b = query(2 * nod + 1, mid + 1, right, start, stop);
}
return a + b;
}
int main() {
FILE *in = fopen("datorii.in", "r");
FILE *out = fopen("datorii.out", "w");
int n, m;
fscanf(in, "%d %d", &n, &m);
int i, nr;
for (i = 1; i <= n; i++) {
fscanf(in, "%d", &nr);
update(1, 1, n, nr, i, 1);
}
int a, b, operatie;
for (i = 1; i <= m; i++) {
fscanf(in, "%d", &operatie);
switch (operatie) {
case 0:
fscanf(in, "%d %d", &a, &b);
update(1, 1, n, b, a, -1);
break;
case 1:
fscanf(in, "%d %d", &a, &b);
fprintf(out, "%d\n", query(1, 1, n, a, b));
break;
}
}
fclose(in);
fclose(out);
return 0;
}