#include <bits/stdc++.h>
const int MAXN = 200005;
int n, m, tot, a[MAXN], b[MAXN], pa[MAXN], pb[MAXN], tr[MAXN], ans[MAXN * 10];
bool tag[MAXN * 10], used[MAXN * 10];
template <typename T>
inline void read(T &x) {
  int fl = 0, ch;
  while (ch = getchar(), ch < 48 || 57 < ch) fl ^= !(ch ^ 45);
  x = (ch & 15);
  while (ch = getchar(), 47 < ch && ch < 58) x = x * 10 + (ch & 15);
  if (fl) x = -x;
}
struct ASK {
  int opt, x, y, id;
} q[MAXN * 10], qq[MAXN * 10];
void upd(int i, int x) {
  for (; i <= n; i += i & -i) tr[i] += x;
}
int qry(int i) {
  int res = 0;
  for (; i; i &= i - 1) res += tr[i];
  return res;
}
void cdq(int l, int r) {
  if (l >= r) return;
  int mid = l + r >> 1;
  cdq(l, mid), cdq(mid + 1, r);
  int i = l, j = mid + 1;
  for (int k = l; k <= r; ++k) {
    if (i <= mid && (j > r || q[i].x <= q[j].x)) {
      if (q[i].opt == 2) upd(q[i].y, 1);
      if (q[i].opt == 3) upd(q[i].y, -1);
      qq[k] = q[i++], used[k] = 1;
    } else {
      if (q[j].opt == 1) ans[q[j].id] += qry(q[j].y);
      qq[k] = q[j++];
    }
  }
  for (int k = l; k <= r; ++k) {
    q[k] = qq[k];
    if (used[k] == 1) {
      if (q[k].opt == 2)
        upd(q[k].y, -1);
      else if (q[k].opt == 3)
        upd(q[k].y, 1);
      used[k] = 0;
    }
  }
}
int main() {
  read(n), read(m);
  for (int i = 1; i <= n; ++i) read(a[i]), pa[a[i]] = i;
  for (int i = 1; i <= n; ++i) read(b[i]), pb[b[i]] = i;
  for (int i = 1; i <= n; ++i) ++tot, q[tot] = (ASK){2, pa[i], pb[i]};
  for (int i = 1; i <= m; ++i) {
    ++tot, read(q[tot].opt);
    if (q[tot].opt == 1) {
      int l1, r1, l2, r2;
      read(l1), read(r1), read(l2), read(r2);
      tag[tot--] = 1;
      ++tot, q[tot] = (ASK){1, r1, r2, tot};
      ++tot, q[tot] = (ASK){1, l1 - 1, r2, tot};
      ++tot, q[tot] = (ASK){1, r1, l2 - 1, tot};
      ++tot, q[tot] = (ASK){1, l1 - 1, l2 - 1, tot};
    } else {
      int x, y;
      read(x), read(y);
      --tot;
      ++tot, q[tot] = (ASK){3, pa[b[x]], x, 0};
      ++tot, q[tot] = (ASK){3, pa[b[y]], y, 0};
      ++tot, q[tot] = (ASK){2, pa[b[x]], y, 0};
      ++tot, q[tot] = (ASK){2, pa[b[y]], x, 0};
      std::swap(b[x], b[y]), std::swap(pb[b[x]], pb[b[y]]);
    }
  }
  cdq(1, tot);
  for (int i = 1; i <= tot; ++i)
    if (tag[i] == 1)
      printf("%d\n", ans[i] - ans[i + 1] - ans[i + 2] + ans[i + 3]);
  return 0;
}
