#include <bits/stdc++.h>
using namespace std;
const int maxN = 100 * 1000 + 50;
int a[maxN], b[maxN], seg[5 * maxN];
struct query {
  int x, y, k;
} q[maxN];
void update(int t, int l, int r, int x, int s, int e) {
  if (l == s && r == e) {
    seg[x] = t;
    return;
  }
  int mid = (s + e) / 2;
  if (r > mid) update(t, max(l, mid), r, 2 * x + 1, mid, e);
  if (l < mid) update(t, l, min(r, mid), 2 * x, s, mid);
}
int getmax(int k, int x, int s, int e) {
  if (e - s < 2) return seg[x];
  int mid = (s + e) / 2;
  if (k < mid) return max(seg[x], getmax(k, 2 * x, s, mid));
  return max(seg[x], getmax(k, 2 * x + 1, mid, e));
}
int main() {
  ios::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> a[i];
  for (int i = 0; i < n; i++) cin >> b[i];
  int cnt = 0;
  for (int i = 0; i < m; i++) {
    int t, x, y, k;
    cin >> t;
    if (t == 1) {
      cin >> x >> y >> k;
      cnt++;
      q[cnt].x = x;
      q[cnt].y = y;
      q[cnt].k = k;
      update(cnt, y - 1, y + k - 1, 1, 0, n);
      continue;
    }
    cin >> x;
    int index = getmax(x - 1, 1, 0, n);
    if (index == 0)
      cout << b[x - 1] << endl;
    else
      cout << a[x - q[index].y + q[index].x - 1] << endl;
  }
  return 0;
}
