#include<bits/stdc++.h>
using namespace std;
#define raed read
const int mx=1e6+23;
int t,pos=0;
int n,q;
int a[mx],b[mx];
struct node{
int tag,v;
};
node ns[mx*4];
struct Q
{
int opt,l,r;
int x;
};
Q qst[mx*4];
inline int raed()
{
int x=0,f=1;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9')
{
x=x*10+c-'0',c=getchar();
}
return x*f;
}
void update(int now)
{
ns[now].v=min(ns[now].v,min(ns[now<<1].v,ns[now<<1|1].v));
}
void maketree(int now,int l,int r){
now=++pos;
if(l==r) ns[now].v=b[now];
int mid=(l+r)/2;
maketree(now<<1,l,mid),maketree(now<<1|1,mid+1,r);
update(now);
}
void pushdown(int now,int l,int r)
{
if(ns[now].tag==0) return ;
int mid=(l+r)/2;
ns[now<<1 ].v+=(mid-l+1)*ns[now].tag;
ns[now<<1|1 ].v+=(r-mid)*ns[now].tag;
ns[now<<1 ].tag+=ns[now].tag;
ns[now<<1|1 ].tag+=ns[now].tag;
ns[now].tag=0;
}
void edit(int now,int l,int r,int el,int er,int k)
{
if(el<=l && er>=r)
{
ns[now].v+=(l-r+1)*k;
ns[now].tag+=k;
return ;
}
int mid=(l+r)/2;
if(el<=mid) edit(now<<1,l,mid,el,er,k);
if(er>=mid) edit(now<<1|1,mid+1,r,el,er,k);
update(now);
}
long long query_min(int now,int l,int r,int el,int er){
if(el<=l && er>=r)
{
return ns[now].v;
}
int mid=(l+r)/2;
long long ans=0x3f3f3f3f;
if(el<=mid) ans=min(ans,query_min(now<<1,l,mid,el,er));
if(er>=mid) ans=min(ans,query_min(now<<1|1,mid+1,r,el,er));
return ans;
}
int main()
{
t=read();
while(t--)
{
int root=0;
pos=0;
n=read(),q=read();
for(int i=1;i<=n;i++)
{
a[i]=raed();
}
for(int i=1;i<=q;i++)
{
qst[i].opt=raed(),qst[i].l=raed(),qst[i].r=read();
if(qst[i].opt==1) qst[i].x=raed();
}
for(int i=1;i<=n;i++)
{
b[i]=read();
}
maketree(root,1,n);
root=pos;
for(int i=q;i>=1;i--)
{
if(qst[i].opt==1) edit(1,1,n,qst[i].l,qst[i].r,-qst[i].x);
if(qst[i].opt==2) qst[i].x=query_min(1,1,n,qst[i].l,qst[i].r);
}
for(int i=1;i<=q;i++)
{
if(qst[i].opt==2) cout<<qst[i].x<<" ";
}
cout<<"\n";
}
return 0;
}