#include <bits/stdc++.h>
using namespace std;
int t[100005 * 4], a[100005], b[100005], x[100005], y[100005];
void down(int p) {
  if (t[p] != -1) {
    t[2 * p] = t[p];
    t[2 * p + 1] = t[p];
    t[p] = -1;
  }
}
void update(int p, int l, int r, int x, int y, int v) {
  if (x == l && y == r) {
    t[p] = v;
    return;
  }
  int m = (l + r) >> 1;
  down(p);
  if (y <= m)
    update(2 * p, l, m, x, y, v);
  else if (x > m)
    update(2 * p + 1, m + 1, r, x, y, v);
  else
    update(2 * p, l, m, x, m, v), update(2 * p + 1, m + 1, r, m + 1, y, v);
}
int query(int p, int l, int r, int x) {
  if (t[p] != -1) return t[p];
  if (l == r) return t[p];
  int m = (l + r) >> 1, ans = 0;
  down(p);
  if (x <= m)
    ans = query(2 * p, l, m, x);
  else
    ans = query(2 * p + 1, m + 1, r, x);
  return ans;
}
int main() {
  int n, m, i, j, k;
  while (~scanf("%d%d", &n, &m)) {
    for (i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (i = 1; i <= n; i++) scanf("%d", &b[i]);
    memset(t, 0, sizeof(t));
    for (i = 1; i <= m; i++) {
      scanf("%d", &k);
      if (k == 1) {
        scanf("%d%d%d", &x[i], &y[i], &j);
        update(1, 1, n, y[i], y[i] + j - 1, i);
      } else {
        scanf("%d", &j);
        int r = query(1, 1, n, j);
        if (r == 0)
          printf("%d\n", b[j]);
        else
          printf("%d\n", a[j - y[r] + x[r]]);
      }
    }
  }
  return 0;
}
