#include <bits/stdc++.h> // All praise is due to Allah alone, and peace and blessings be
using namespace std; // upon him, after whom there is no other Prophet.
template<class T> class Stree { private:
vector<T> tree, lazy; int n; T op(T a, T b) { return max(a, b); }
void push(int node, int l, int r) {
if (!lazy[node]) return;
tree[node] = tree[node] + (r - l + 1) * lazy[node];
//tree[node] = 1LL * (r - l + 1) * lazy[node];
if (l != r) {
int64_t left = node * 2, right = left + 1;
lazy[left] += lazy[node];
lazy[right] += lazy[node];
} lazy[node] = 0;
}
void build(int node, int l, int r, const vector<T>& ar) {
lazy[node] = 0;
if (l == r) { tree[node] = ar[l - 1]; return; }
int mid = (r + l) / 2, left = node * 2, right = left + 1;
build(left, l, mid, ar); build(right, mid + 1, r, ar);
tree[node] = op(tree[left], tree[right]);
}
void update(int node, int l, int r, int qb, int qe, T v) {
push(node, l, r); if (l > qe || r < qb) return;
if (l >= qb && r <= qe) {
lazy[node] += v; push(node, l, r); return;
}
int mid = (r + l) / 2, left = node * 2, right = left + 1;
update(left, l, mid, qb, qe, v);
update(right, mid + 1, r, qb, qe, v);
tree[node] = op(tree[left], tree[right]);
}
T query(int node, int l, int r, int qb, int qe) {
push(node, l, r);
if (l > qe || r < qb) return 0;
if (l >= qb && r <= qe) return tree[node];
int mid = (r + l) / 2, left = node * 2, right = left + 1;
return op(query(left, l, mid, qb, qe), query(right, mid + 1, r, qb, qe));
}
public: Stree(int size){ n = size, tree.resize(4 * n, 0); lazy.resize(4 * n, 0); }
void build(const vector<T>& ar) { build(1, 1, n, ar); }
void update(int l, int r, T v) { update(1, 1, n, l, r, v); }
T query(int l, int r) { return query(1, 1, n, l, r); }
};
int32_t main() {
cin.tie(0)->sync_with_stdio(false);
int32_t Case = 1; cin >> Case;
for (int T = 1; T <= Case; T++) {
int n, q; cin >> n;
vector<int64_t> ar(n);
for(int i = 0; i < n; i++) cin >> ar[i];
Stree<int64_t> st(n);
st.build(ar);
cin >> q;
function<void()> Test_Case = [&]() {
while(q--) {
int t, l, r; cin >> t >> l >> r;
if(t == 1) {
int x; cin >> x;
st.update(l, r, x);
}
else {
cout << st.query(l, r) << '\n';
}
}
};
Test_Case();
}
return 0;
}