#include <bits/stdc++.h>
using namespace std;
const long long N = 1e6 + 10, inf = 1e18, mod = 1e9 + 7;
long long a[N], b[N], q[N], q2[N];
unordered_map<int, int> mp;
vector<long long> cmp;
struct node {
  int l, r, col = 0;
  int size() { return r - l; }
  int unity(int lq, int rq) { return max(0, min(r, rq) - max(l, lq)); }
  bool init(int lq, int rq) { return unity(lq, rq) == size(); }
  bool leaf() { return size() == 1; }
};
node seg[4 * N];
void build(int v, int l, int r) {
  seg[v].l = l;
  seg[v].r = r;
  if (seg[v].leaf()) return;
  int mid = (l + r) / 2;
  build(2 * v, l, mid);
  build(2 * v + 1, mid, r);
}
void add(int v, int l, int r, int cl) {
  if (!seg[v].unity(l, r)) return;
  if (seg[v].init(l, r)) {
    seg[v].col = cl;
    return;
  }
  add(v * 2, l, r, cl);
  add(v * 2 + 1, l, r, cl);
}
int get(int v, int ind) {
  if (!seg[v].unity(ind, ind + 1)) return 0;
  if (seg[v].leaf()) {
    return seg[v].col;
  }
  return max(max(get(v * 2, ind), get(v * 2 + 1, ind)), seg[v].col);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= n; i++) cin >> b[i];
  long long id = 1;
  build(1, 1, n + 1);
  for (int i = 0; i < m; i++) {
    int tp;
    cin >> tp;
    if (tp == 1) {
      long long x, y, k;
      cin >> x >> y >> k;
      q[id] = x;
      q2[id] = y;
      add(1, y, y + k, id);
      id++;
    } else {
      long long ind;
      cin >> ind;
      long long c = get(1, ind);
      if (c == 0)
        cout << b[ind] << '\n';
      else {
        long long x = q[c], y = q2[c];
        cout << a[x + ind - y] << '\n';
      }
    }
  }
  return 0;
}
