#include <bits/stdc++.h>
using namespace std;
struct SegTree {
struct Node {
long long val, lazy;
};
vector<Node> tree;
int n;
SegTree(int n) {
this->n = n;
tree.resize(4 * n + 5, {0, 0});
}
void build(vector<long long>& a, int idx, int l, int r) {
if(l == r) {
tree[idx].val = a[l];
return;
}
int mid = (l + r) / 2;
build(a, idx*2, l, mid);
build(a, idx*2+1, mid+1, r);
tree[idx].val = max(tree[idx*2].val, tree[idx*2+1].val);
}
void push(int idx, int l, int r) {
if(tree[idx].lazy != 0) {
tree[idx].val += tree[idx].lazy;
if(l != r) {
tree[idx*2].lazy += tree[idx].lazy;
tree[idx*2+1].lazy += tree[idx].lazy;
}
tree[idx].lazy = 0;
}
}
void update(int idx, int l, int r, int ql, int qr, long long val) {
push(idx, l, r);
if(r < ql || qr < l) return;
if(ql <= l && r <= qr) {
tree[idx].lazy += val;
push(idx, l, r);
return;
}
int mid = (l + r) / 2;
update(idx*2, l, mid, ql, qr, val);
update(idx*2+1, mid+1, r, ql, qr, val);
tree[idx].val = max(tree[idx*2].val, tree[idx*2+1].val);
}
long long query(int idx, int l, int r, int ql, int qr) {
push(idx, l, r);
if(r < ql || qr < l) return LLONG_MIN;
if(ql <= l && r <= qr) return tree[idx].val;
int mid = (l + r) / 2;
return max(query(idx*2, l, mid, ql, qr),
query(idx*2+1, mid+1, r, ql, qr));
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while(T--) {
int N;
cin >> N;
vector<long long> a(N+1);
for(int i=1; i<=N; i++) cin >> a[i];
SegTree st(N);
st.build(a, 1, 1, N);
int Q;
cin >> Q;
while(Q--) {
int type, L, R;
cin >> type >> L >> R;
if(type == 1) {
long long X;
cin >> X;
st.update(1, 1, N, L, R, X);
}
else {
cout << st.query(1, 1, N, L, R) << "\n";
}
}
}
return 0;
}