#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;
}
/*#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define maxn 35001
#define maxm 100001
struct trip
{
int t;
int x, y;
};
int n,m,i,p;
int a[maxn];
int v[2*maxn];
trip q[maxn];
void readdata()
{
FILE *f = fopen("datorii.in","rt");
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=n;i++)
{
fscanf(f,"%d",&a[i]);
}
for (i=1;i<=m;i++)
{
fscanf(f,"%d%d%d",&q[i].t,&q[i].x,&q[i].y);
}
fclose(f);
}
int build_bin(int i)
{
if (i>=p)
{
v[i]=a[i-p+1];
return v[i];
}
v[i]=build_bin(2*i)+build_bin(2*i+1);
return v[i];
}
int get_val(int x, int y)
{
long long st=0, dr=0;
int next;
while (x>1)
{
next=x/2;
if ((x%2)==1)
{
st+=v[x-1];
}
x=next;
}
while (y>1)
{
next=y/2;
if ((y%2)==0)
{
dr+=v[y+1];
}
y=next;
}
return v[1]-st-dr;
}
void mod_val(int x, int y)
{
while (x>0)
{
v[x]-=y;
x/=2;
}
}
void solve()
{
p=1;
while (p<n) p*=2;
build_bin(1);
}
void writedata()
{
FILE *f = fopen("datorii.out","wt");
for (i=1;i<=m;i++)
{
if (q[i].t)
{
fprintf(f,"%d\n",get_val(q[i].x+p-1,q[i].y+p-1));
}
else
{
mod_val(q[i].x+p-1,q[i].y);
}
}
fprintf(f,"\n");
fclose(f);
}
int main()
{
readdata();
solve();
writedata();
return 0;
}
*/