#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;   }   