rt, WA on 10,瞪了好久也没找到哪里错了 qaq
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 10;
const int MAXM = 450;
int len, tot, a[MAXN], tl[MAXM], tr[MAXM], bel[MAXN];
int pre[MAXM][MAXM], cnt[MAXM][MAXN];
inline
void init(int n) {
len = sqrt(n), tot = (n - 1) / len + 1;
for (int i = 1; i <= tot; i++) tl[i] = tr[i - 1] + 1, tr[i] = i * len; tr[tot] = n;
for (int i = 1; i <= tot; i++) {
for (int j = tl[i]; j <= tr[i]; j++) bel[j] = i;
for (int j = 1; j <= tot; j++) pre[i][j] = pre[i - 1][j];
for (int j = 1; j <= n; j++) cnt[i][j] = cnt[i - 1][j];
for (int j = tl[i]; j <= tr[i]; j++) pre[i][bel[a[j]]]++, cnt[i][a[j]]++;
}
}
inline
void change(int x, int y) {
if (x > y) swap(x, y);
int p = bel[x], q = bel[y];
for (int i = p; i < q; i++) {
pre[i][bel[a[x]]]--, cnt[i][a[x]]--;
pre[i][bel[a[y]]]++, cnt[i][a[y]]++;
}
swap(a[x], a[y]);
}
inline
int ask(int l, int r, int lx, int rx) {
if (l > r) return 0;
int p = bel[lx], q = bel[rx], ans = 0;
if (p == q) {
for (int i = lx; i <= rx; i++) ans += cnt[r][i] - cnt[l - 1][i];
return ans;
}
for (int i = lx; i <= tr[p]; i++) ans += cnt[r][i] - cnt[l - 1][i];
for (int i = p + 1; i < q; i++) ans += pre[r][i] - pre[l - 1][i];
for (int i = tl[q]; i <= rx; i++) ans += cnt[r][i] - cnt[l - 1][i];
return ans;
}
inline
int query(int l, int r, int lx, int rx) {
int p = bel[l], q = bel[r], ans = 0;
if (p == q) {
for (int i = l; i <= r; i++) ans += lx <= a[i] && a[i] <= rx;
return ans;
}
for (int i = l; i <= tr[p]; i++) ans += lx <= a[i] && a[i] <= rx;
ans += ask(p + 1, q - 1, lx, rx);
for (int i = tl[q]; i <= r; i++) ans += lx <= a[i] && a[i] <= rx;
return ans;
}
int n, m, p[MAXN];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), p[a[i]] = i;
for (int i = 1, x; i <= n; i++) scanf("%d", &x), a[i] = p[x]; init(n);
for (int op, l, r, lx, rx; m--;) {
scanf("%d%d%d", &op, &lx, &rx);
if (op == 1) scanf("%d%d", &l, &r), printf("%d\n", query(l, r, lx, rx));
else change(lx, rx);
}
}