#include<bits/stdc++.h>
#define maxn 300010
#define INF 1000000000000010
#define int long long
using namespace std;
int a[maxn],t,top;
long long b[maxn],ans[maxn];
struct node
{
int left,right;
long long minn,sum;
long long la;
}e[maxn*2];
struct ts
{
int l,r,cnt,x;
}s[maxn];
void update(int id)
{
e[id].minn=min(e[id<<1].minn,e[id<<1|1].minn);
}
void pushdown(int id)
{
if(e[id].la)
{
e[id<<1].minn+=e[id].la;
e[id<<1|1].minn+=e[id].la;
e[id<<1].la+=e[id].la;
e[id<<1|1].la+=e[id].la;
e[id].la=0;
return ;
}
}
void build(int id,int l,int r)
{
e[id].left=l;
e[id].right=r;
e[id].la=0;
if(l==r)
{
e[id].minn=b[l];
return ;
}
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
update(id);
return;
}
void change(int id,int l,int r,int d)
{
if(l<=e[id].left&&r>=e[id].right)
{
e[id].la+=d;
e[id].minn+=d;
return;
}
pushdown(id);
int mid=(e[id].left+e[id].right)>>1;
if(l<=mid) change(id<<1,l,r,d);
if(r>mid) change(id<<1|1,l,r,d);
update(id);
}
long long query(int id,int l,int r)
{
if(l<=e[id].left&&e[id].right<=r)
{
return e[id].minn;
}
pushdown(id);
int mid=(e[id].left+e[id].right)>>1;
long long val=INF;
if(l<=mid) val=min(val,query(id<<1,l,r));
if(r>mid) val=min(val,query(id<<1|1,l,r));
return val;
}
void intt(int n,int q)
{
top=0;
memset(ans,0,sizeof(ans));
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
memset(e,0,sizeof(e));
memset(s,0,sizeof(s));
for(int i=1;i<=n*2;i++) e[i].minn=INF;
}
signed main()
{
scanf("%lld",&t);
while(t--)
{
int n,q;
scanf("%lld%lld",&n,&q);
intt(n,q);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=q;i++)
{
scanf("%lld%lld%lld",&s[i].cnt,&s[i].l,&s[i].r);
if(s[i].cnt==1) scanf("%d",&s[i].x),s[i].x=-s[i].x;
}
for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
build(1,1,n);
for(int i=q;i>=1;i--)
{
if(s[i].cnt==1)
{
change(1,s[i].l,s[i].r,s[i].x);
}
if(s[i].cnt==2)
{
top++;
ans[top]=query(1,s[i].l,s[i].r);
}
}
for(int i=top;i>=1;i--) printf("%lld ",ans[i]);
printf("\n");
}
return 0;
}