#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#ifdef velox
#include "debug.h"
#else
#define dbg(x...)
#endif
#define srt(v) sort(v.begin(),v.end())
#define grtsrt(v) sort(v.begin(),v.end(),greater<ll>())
#define unq(v) v.erase(unique(v.begin(),v.end()),v.end())
#define rev(v) reverse(v.begin(),v.end())
#define set_bits(x) __builtin_popcountll(x)
#define fst_zero(x) 63-__builtin_ctzll(x)
#define lst_zero(x) __builtin_ctzll(x)
#define gcd(x,y) __gcd(x,y)
#define lcm(x,y) ((x/gcd(x,y))*y)
#define YES cout << "YES" << endl
#define NO cout << "NO" << endl
#define ceil(x,y) ((x+y-1)/y)
#define ll long long
#define pb push_back
#define endl '\n'
#define fx(x) fixed<<setprecision(x)
template <typename T> using pbds = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const ll MOD = 1e9+7;
void file(){
#ifdef velox
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
freopen("error.txt","w",stderr);
#endif
}
const ll N = 1e5+10;
vector<ll> v,t,lazy;
void marge(ll n, ll b, ll e){
if(lazy[n]==0) return;
t[n]+=lazy[n];
if(b!=e){
ll l=n*2;
ll r=(n*2)+1;
lazy[l]+=lazy[n];
lazy[r]+=lazy[n];
}
lazy[n]=0;
}
void make(ll n,ll b, ll e){
lazy[n]=0;
if(b==e){
t[n]=v[b];
return;
}
ll mid=(b+e)/2;
ll l=(n*2);
ll r=(n*2)+1;
make(l,b,mid);
make(r,mid+1,e);
t[n]= max(t[l],t[r]);
}
void update(ll n,ll b,ll e, ll i,ll j, ll val){
marge(n,b,e); // lazy
if(i>e || j<b) return;
if(i<=b && j>=e){
lazy[n] += val;
marge(n,b,e); // lazy
return;
}
ll mid=(b+e)/2;
ll l=(n*2);
ll r=(n*2)+1;
update(l,b,mid,i,j,val);
update(r,mid+1,e,i,j,val);
t[n]= max(t[l],t[r]);
}
ll query(ll n, ll b, ll e, ll i, ll j){
marge(n,b,e); // lazy
if(i>e || j<b) return LLONG_MIN;
if(i<=b && j>=e) return t[n];
ll mid=(b+e)/2;
ll l=(n*2);
ll r=(n*2)+1;
return max(query(l,b,mid,i,j),query(r,mid+1,e,i,j));
}
int main(){
// file();
ios_base::sync_with_stdio(0); cin.tie(0);
ll tt=1;
cin >> tt;
while(tt--){
ll len; cin >> len;
v.assign(len+1, 0);
t.assign(4*(len+1), 0);
lazy.assign(4*(len+1), 0);
for(int x=1; x<=len; x++) cin >> v[x];
make(1,1,len);
// dbg(dp);
ll k; cin >> k;
while(k--){
int type; cin >> type;
if (type == 1) {
int l, r; ll x;
cin >> l >> r >> x;
update(1, 1, len, l, r, x);
} else {
int l, r;
cin >> l >> r;
cout << query(1, 1, len, l, r) << endl;
}
}
}
return 0;
}