#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define itn int ;
using namespace std ;
const int LONG = 50001 ;
int T , n , q ;
int origin[LONG] , End[LONG] ;
int tmp[LONG] , Left[LONG] , Right[LONG] , num[LONG] ;
struct Segment_Tree {
int l ;
int r ;
int lazy ;
int MIN ;
Segment_Tree()
{
r = l = lazy = 0 ;
MIN = 1e9 ;
} ;
}a[LONG] ;
inline void update(int k)
{
a[k].MIN = min(a[k * 2].MIN , a[k * 2 + 1].MIN) ;
}
void build (int k , int l , int r)
{
a[k].l = l ;
a[k].r = r ;
if(l == r)
{
a[k].MIN = End[l] ;
return ;
}
int mid = (l + r) / 2 ;
build(k * 2 , l , mid) ;
build(k * 2 + 1 , mid + 1 , r) ;
update(k) ;
}
void empty(int k , int l , int r)
{
a[k].l = 0 ;
a[k].r = 0 ;
if(l == r)
{
a[k].MIN = 0 ;
return ;
}
int mid = (l + r) / 2 ;
empty(k * 2 , l , mid) ;
empty(k * 2 + 1 , mid + 1 , r) ;
}
int Find_MIN(int k , int l , int r)
{
if(a[k].l <= l && a[k].r >= r)
{
return a[k].MIN ;
}
int mid = (a[k].l + a[k].r) / 2 ;
int minn = 1e9 + 7 ;
if(l <= mid)
minn = min(minn , Find_MIN(k * 2 , l , mid) ) ;
if(r > mid)
minn = min(minn , Find_MIN(k * 2 + 1 , mid + 1 , r) ) ;
return minn;
}
void pushdown (int k)
{
if(a[k].l == a[k].r )
{
a[k].lazy = 0 ;
return ;
}
a[k * 2].MIN -= a[k].lazy ;
a[k * 2 + 1].MIN -= a[k].lazy ;
a[k * 2].lazy += a[k].lazy ;
a[k * 2 + 1].lazy += a[k].lazy ;
a[k].lazy = 0 ;
}
void Subtract(int k , int l , int r , int x)
{
if(a[k].l == l && a[k].r == r)
{
a[k].MIN -= x ;
a[k].lazy += x ;
return ;
}
int mid = (a[k].l +a[k].r) / 2 ;
if(r <= mid)
Subtract(k * 2 , l , r , x) ;
else if(l > mid)
Subtract(k * 2 + 1 , l , r ,x) ;
else
{
Subtract(k * 2 , l , mid , x) ;
Subtract(k * 2 + 1 , mid + 1 , r , x) ;
}
update(k) ;
}
int main ()
{
std::ios::sync_with_stdio(false);
cin >> T ;
for(int i = 1 ; i <= T ; i++)
{
cin >> n >> q ;
for(int j = 1 ; j <= n ; j++)
cin >> origin[j] ;
for(int j = 1 ; j <= q ; j++)
{
cin >> tmp[j];
if(tmp[j] == 1)
cin >> Left[j] >> Right[j] >> num[j] ;
else
cin >> Left[j] >> Right[j] ;
}
for(int j = 1 ; j <= n ; j++)
cin >> End[j] ;
for(int i = q ; i > 0 ; i--)
{
if(tmp[i] == 1)
{
Subtract(1 , Left[i] , Right[i] , num[i]) ;
}
else
{
num[i] = Find_MIN(1 , Left[i] , Right[i]) ;
}
}
for(int i = 1 ; i <= q ; i++)
{
if(tmp[i] == 2)
{
cout << num[i] << " " ;
}
}
for(int i = 1 ; i < n ; i++ )
{
origin[i] = 0 ;
End[i] = 0 ;
}
}
return 0 ;
}