#include <bits/stdc++.h>
#define ll long long
const ll MAXN=2e5;
using namespace std;
ll n,q,a[MAXN+5],b[MAXN+5];
ll lazy[4*MAXN+5];
void push(ll v){
    if(lazy[v]==1e18) return;
    lazy[2*v]=lazy[v];
    lazy[2*v+1]=lazy[v];
    lazy[v]=1e18;
}
void update(ll v,ll tl,ll tr,ll l,ll r,ll x,ll y){
    if(l>r) return;
    if(tl==l && tr==r) lazy[v]=x-y;
    else{
        push(v);
        ll tm=(tl+tr)/2;
        update(2*v,tl,tm,l,min(r,tm),x,y);
        update(2*v+1,tm+1,tr,max(l,tm+1),r,x,y);
    }
}
ll query(ll v,ll l,ll r,ll pos){
    if(l==r) return lazy[v];
    else{
        push(v);
        ll m=(l+r)/2;
        if(pos<=m) return query(2*v,l,m,pos);
        else return query(2*v+1,m+1,r,pos);
    }
}
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    if(fopen("skibidi.inp","r")){
        freopen("skibidi.inp","r",stdin);
        freopen("skibidi.out","w",stdout);
    }
    cin>>n>>q;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=0;i<=4*MAXN;i++) lazy[i]=1e18;
    while(q--){
        ll type;
        cin>>type;
        if(type==1){
            ll x,y,k;
            cin>>x>>y>>k;
            update(1,1,n,y,y+k-1,x,y);
        }
        else{
            ll i;
            cin>>i;
            ll tmp=query(1,1,n,i);
            if(tmp==1e18) cout<<b[i];
            else cout<<a[tmp+i];
            cout<<'\n';
        }
    }
    return 0;
}
