rt,WA了
#include <bits/stdc++.h>
using namespace std;
const int MAX = 3e5 + 30;
inline int read()
{
int x = 0; char ch = getchar();
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch xor 48), ch = getchar();
return x;
}
inline void write (int x)
{
if (x > 9) write(x / 10);
putchar (x % 10 + 48);
}
int n, m, a[MAX], max_a; bool b[MAX];
inline void input()
{
n = read(), m = read();
for (register int i = 1; i <= n; ++ i)
a[i] = read(), max_a = max(max_a, a[i]), b[a[i]] = true;
}
int T[MAX << 5], lc[MAX << 5], rc[MAX << 5], tot, rt[MAX];
int build (int l, int r)
{
int cur = ++ tot;
if (l == r) return cur;
int mid = l + r >> 1;
lc[cur] = build(l, mid), rc[cur] = build(mid + 1, r);
return cur;
}
int insert (int l, int r, int pos, int pre)
{
int cur = ++ tot; T[cur] = T[pre];
if (l == r) return (void)(++ T[cur]), cur;
lc[cur] = lc[pre], rc[cur] = rc[pre];
int mid = l + r >> 1;
if (pos <= mid) lc[cur] = insert(l, mid, pos, lc[pre]);
else rc[cur] = insert(mid + 1, r, pos, rc[pre]);
return (void)(T[cur] = T[lc[cur]] + T[rc[cur]]), cur;
}
inline void init()
{
rt[0] = build(1, max_a);
for (register int i = 1; i <= n; ++ i) rt[i] = insert(1, max_a, a[i], rt[i - 1]);
}
int query (int pre, int sub, int l, int r, int pos)
{
if (l == r) return T[sub] - T[pre];
int mid = l + r >> 1;
if (pos <= mid) return query(lc[pre], lc[sub], l, mid, pos);
else return query(rc[pre], rc[sub], mid + 1, r, pos);
}
void update (int cur, int l, int r, int pos, int val)
{
if (l == r) return (void)(T[cur] += val);
int mid = l + r >> 1;
if (pos <= mid) update(lc[cur], l, mid, pos, val);
else update(rc[cur], mid + 1, r, pos, val);
T[cur] = T[lc[cur]] + T[rc[cur]];
}
inline void work()
{
while (m --)
{
int opt = read();
if (opt == 1)
{
int l = read(), r = read(), c = read();
if (!b[c]) { puts("0"); continue; }
write(query(rt[l - 1], rt[r], 1, max_a, c)), putchar('\n');
}
else
{
int x = read();
update(rt[x], 1, max_a, a[x], -1), update(rt[x], 1, max_a, a[x + 1], 1);
// update(rt[x + 1], 1, max_a, a[x + 1], -1), update(rt[x + 1], 1, max_a, a[x], 1);
swap (a[x], a[x + 1]);
}
}
}
int main()
{
input();
init();
work();
return 0;
}
(验证码6664祭