#include <bits/stdc++.h>
using namespace std;
int add[500000], pre[500000], ans, a[110000], b[110000];
void pushdown(int l, int r, int pos) {
  if (l == r) return;
  if (add[pos] != -1000000) {
    add[pos * 2] = add[pos];
    add[pos * 2 + 1] = add[pos];
    add[pos] = -1000000;
  }
  return;
}
void query(int x, int l, int r, int pos) {
  if (l == r) {
    if (add[pos] == -1000000)
      ans = b[x];
    else
      ans = a[add[pos] + x];
    return;
  }
  pushdown(l, r, pos);
  int mid = (l + r) / 2;
  if (x <= mid)
    query(x, l, mid, pos * 2);
  else
    query(x, mid + 1, r, pos * 2 + 1);
}
void update(int x, int y, int k, int l, int r, int pos) {
  if (x <= l && y >= r) {
    add[pos] = k;
    return;
  }
  pushdown(l, r, pos);
  int mid = (l + r) / 2;
  if (x <= mid) update(x, y, k, l, mid, pos * 2);
  if (y > mid) update(x, y, k, mid + 1, r, pos * 2 + 1);
  return;
}
int main() {
  int n, i, kind, m, x, y, l;
  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]);
  for (i = 1; i <= 450000; i++) add[i] = -1000000;
  while (m--) {
    scanf("%d", &kind);
    if (kind == 2) {
      scanf("%d", &x);
      query(x, 1, n, 1);
      printf("%d\n", ans);
    } else {
      scanf("%d%d%d", &x, &y, &l);
      update(y, y + l - 1, x - y, 1, n, 1);
    }
  }
  return 0;
}
