#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define endl '\n'
#define ff first
#define ss second
#define debug cout<<"HERE"<<endl;
void edm()
{
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
freopen("outputtt.txt","w",stdout);
#endif
}
int arr[200000];
int tree[800000];
int lazytree[800000];
void build(int node, int s, int e)
{
if (s == e)
{
tree[node] = arr[s];
return;
}
int left = node * 2 + 1;
int right = node * 2 + 2;
int mid = (s + e) / 2;
build(left, s, mid);
build(right, mid + 1, e);
tree[node] = max(tree[left],tree[right]);
}
void propagate(int node, int s, int e)
{
if (lazytree[node] != 0)
{
tree[node] += lazytree[node];
if (s != e)
{
lazytree[node * 2 + 1] += lazytree[node];
lazytree[node * 2 + 2] += lazytree[node];
}
lazytree[node] = 0;
}
}
void updaterange(int node, int s, int e, int l, int r,int val)
{
propagate(node,s,e);
if (s > e || s > r || e < l) return;
if(s >= l && e <= r)
{
tree[node] += val;
if(s != e)
{
lazytree[node * 2 + 1] += val;
lazytree[node * 2 + 2] += val;
}
return;
}
int m = (s + e) / 2;
updaterange(node * 2 + 1, s, m, l, r, val);
updaterange(node * 2 + 2, m + 1, e, l, r, val);
tree[node] = max(tree[node * 2 + 1], tree[node * 2 + 2]);
}
int maxquery(int node, int s, int e, int l, int r)
{
propagate(node, s, e);
if (s > e || s > r || e < l) return -1;
if (s >= l && e <= r) return tree[node];
int mid = (s + e) / 2;
return max(maxquery(node * 2 + 1, s, mid, l, r),maxquery(node * 2 + 2, mid + 1, e, l, r));
}
void solve()
{
int n;cin>>n;
for(int i=0;i<n;i++)cin>>arr[i];
build(0,0,n-1);
int q;cin>>q;
while(q--)
{
int a;cin>>a;
if(a==1)
{
int l,r,v;cin>>l>>r>>v;
l--;
r--;
updaterange(0,0,n-1,l,r,v);
}
else
{
int l,r;cin>>l>>r;
l--;
r--;
cout<<maxquery(0,0,n-1,l,r)<<endl;
}
}
}
int32_t main()
{
//edm();
int t = 1;
cin>>t;
for(int i=1;i<=t;i++)
{
solve();
}
}