/*
* Copyright (c) 2025 Emon Thakur
* All rights reserved.
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
// #define cout file
ll a[100005],add[400],mx[400],blocksize,n,block[100005];
void update(int l,int r,ll x)
{
int blockl = block[l];
int blockr = block[r];
if(blockl == blockr)
{
for(int i=l;i<=r;i++) a[i] += x;
ll mxb = -1e18;
for(int i=(blocksize*(blockl-1))+1;i<=min(n,blocksize*blockl);i++) a[i]+= add[blockl] , mxb = max(mxb , a[i]);
mx[blockl] = mxb;
add[blockl] = 0;
return;
}
if(l%blocksize != 1)
{
int last = min(n,blocksize*blockl);
for(int i=l;i<=last;i++) a[i] += x;
ll mxb = -1e18;
for(int i=(blocksize*(blockl-1))+1;i<=last;i++) a[i] += add[blockl], mxb = max(mxb , a[i]);
mx[blockl] = mxb;
add[blockl] = 0;
blockl++;
}
if(r%blocksize)
{
int first = blocksize*(blockr-1)+1;
for(int i=r;i>=first;i--) a[i] += x;
ll mxb = -1e18;
for(int i=min(n,blocksize*blockr);i>=first;i--) a[i] += add[blockr] , mxb = max(mxb , a[i]);
mx[blockr] = mxb;
add[blockr] = 0;
--blockr;
}
for(int i=blockl;i<=blockr;i++) add[i] += x;
}
ll query(int l,int r)
{
ll ans = -1e18;
int blockl = block[l];
int blockr = block[r];
if(blockl == blockr)
{
for(int i=l;i<=r;i++) ans = max(ans , a[i] + add[blockl]);
return ans;
}
if(l%blocksize != 1)
{
int last = min(n,blocksize*blockl);
for(int i=l;i<=last;i++) ans = max(ans , a[i] + add[blockl]);
blockl++;
}
if(r%blocksize)
{
int first = blocksize*(blockr-1)+1;
for(int i=r;i>=first;i--) ans = max(ans , a[i] + add[blockr]);
--blockr;
}
for(int i=blockl;i<=blockr;i++) ans = max(ans , mx[i] + add[i]);
return ans;
}
void solve(int tc)
{
// string outp = "output"+to_string(tc)+".txt";
// string inp = "input"+to_string(tc)+".txt";
// ofstream file(outp);
// freopen(inp.c_str(),"r",stdin);
int t; cin >> t; while(t--)
{
cin >> n;
blocksize = sqrt(n);
for(int i=1;i<=n;i++) cin >> a[i], block[i]=(i+blocksize-1)/blocksize;
for(int i=1;i<400;i++) add[i]=0, mx[i] = -1e18;
for(int i=1;i<=n;i+=blocksize)
{
ll mxv = a[i];
for(int j=i;j<=min(n,i+blocksize-1);j++)
{
mxv = max(mxv , a[j]);
}
mx[block[i]] = mxv;
}
ll q,type,l,r,x; cin >> q;
while(q--)
{
cin >> type;
if(type==1)
{
cin >> l >> r >> x;
update(l,r,x);
}
else
{
cin >> l >> r;
cout<<query(l,r)<<'\n';
}
}
}
}
int32_t main()
{
ios::sync_with_stdio(false); cin.tie(nullptr);
solve(0);
//for(int tc=0;tc<50;tc++) solve(tc);
}