#include <iostream>
using namespace std;
#define lson (k << 1)
#define rson (k << 1 | 1)
const int maxn = 2e5 + 10;
int n, m, a[maxn], b[maxn], B[maxn], rt[maxn << 2];
namespace ST {
int tot, c[maxn << 6], ls[maxn << 6], rs[maxn << 6];
void update(int &k, int l, int r, int p, int v) {
if (!k) k = ++tot; c[k] += v;
if (l == r) return;
int mid = (l + r) >> 1;
if (p <= mid) update(ls[k], l, mid, p, v);
else update(rs[k], mid + 1, r, p, v);
}
int query(int k, int l, int r, int L, int R) {
if (!k) return 0;
if (L <= l && r <= R) return c[k];
int mid = (l + r) >> 1, res = 0;
if (L <= mid) res += query(ls[k], l, mid, L, R);
if (R > mid) res += query(rs[k], mid + 1, r, L, R);
return res;
}
}
void update(int k, int l, int r, int x, int y, int v) {
ST::update(rt[k], 1, n, y, v);
if (l == r) return;
int mid = (l + r) >> 1;
if (x <= mid) update(lson, l, mid, x, y, v);
else update(rson, mid + 1, r, x, y, v);
}
int query(int k, int l, int r, int L1, int R1, int L2, int R2) {
if (L1 <= l && r <= R1) return ST::query(rt[k], 1, n, L2, R2);
int mid = (l + r) >> 1, res = 0;
if (L1 <= mid) res += query(lson, l, mid, L1, R1, L2, R2);
if (R1 > mid) res += query(rson, mid + 1, r, L1, R1, L2, R2);
return res;
}
int main() {
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1, x; i <= n; i++) cin >> x, a[x] = i;
for (int i = 1; i <= n; i++) cin >> B[i], b[B[i]] = i;
for (int i = 1; i <= n; i++) update(1, 1, n, a[i], b[i], 1);
while (m--) {
int op, l1, r1, l2, r2; cin >> op >> l1 >> r1;
if (op == 1) cin >> l2 >> r2, cout << query(1, 1, n, l1, r1, l2, r2) << '\n';
else update(1, 1, n, a[B[l1]], l1, -1), update(1, 1, n, a[B[l1]], r1, 1),
update(1, 1, n, a[B[r1]], r1, -1), update(1, 1, n, a[B[r1]], l1, 1), swap(B[l1], B[r1]);
}
return 0;
}
怎么看都是O(nlog2n)的啊,6s的时限也不至于TLE啊