#include<stdio.h>
#include<math.h>
#define N 300009
#include<map>
std::map < int, int > cnt[1509];
static int a[N], whe[N];
static int st[N], en[N];
inline void swap(register int& a, register int& b) {a ^= b, b ^= a, a ^= b;}
inline int query(register int l, register int r, register int c)
{
register int L = whe[l], R = whe[r], ret = 0;
if (L == R)
for (register int i = l;i <= r;++ i)
(a[i] == c) ? ++ ret : 0;
else
{
for (register int i = l;i <= en[L];++ i)
(a[i] == c) ? ++ ret : 0;
for (register int i = st[R];i <= r;++ i)
(a[i] == c) ? ++ ret : 0;
for (register int i = L + 1;i < R;++ i)
ret += cnt[i][c];
}
return ret;
}
inline int read()
{
register int ret = 0;
register char ch = getchar();
while (ch < '0' || ch > '9')
ch = getchar();
while (ch >= '0' && ch <= '9')
ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
return ret;
}
inline void write(register int x)
{
static int s[7];
register int top = 0;
while (x)
s[++ top] = x % 10, x /= 10;
while (top)
putchar('0' + s[top --]);
}
int main()
{
register int n = read(), m = read();
for (register int i = 1;i <= n;++ i)
a[i] = read();
register int block = sqrt(n);
if (n % block)
++ block;
for (register int i = 1;i <= block;++ i)
st[i] = en[i - 1] + 1, en[i] = st[i] + block - 1;
en[block] = n;
for (register int i = 1;i <= block;++ i)
for (register int j = st[i];j <= en[i];++ j)
whe[j] = i, cnt[i][a[j]] ++;
register int opt, l, r, c;
while (m --)
{
opt = read(), l = read();
if (opt == 2)
-- cnt[whe[l]][a[l]], -- cnt[whe[l + 1]][a[l + 1]],
swap(a[l], a[l + 1]),
++ cnt[whe[l]][a[l]], ++ cnt[whe[l + 1]][a[l + 1]];
else
{
r = read(), c = read();
printf("%d\n", query(l, r, c));
}
}
return 0;
}