var i,j,k,l,m,n,p,q,r,s,t,d:longint;
father,left,right,data,delta,mid:array[0..300000] of longint;
xd:array[0..300000,1..2] of longint;
hx:array[0..100000] of longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
function ask_max(l,r,num:longint):longint;
begin
if (l=xd[num,1])and(r=xd[num,2]) then exit(data[num]);
if r<=mid[num] then ask_max:=ask_max(l,r,left[num]) else
if l>mid[num] then ask_max:=ask_max(l,r,right[num]) else
ask_max:=max(ask_max(l,mid[num],left[num]),ask_max(mid[num]+1,r,right[num]));
inc(ask_max,delta[num]);
end;
procedure ins(l,r,num:longint);
begin
if (l=xd[num,1])and(r=xd[num,2]) then
begin
inc(delta[num],d);inc(data[num],d);exit;
end;
if delta[num]<>0 then
begin
inc(delta[left[num]],delta[num]);inc(delta[right[num]],delta[num]);
inc(data[left[num]],delta[num]);inc(data[right[num]],delta[num]);
delta[num]:=0;
end;
if r<=mid[num] then ins(l,r,left[num]) else
if l>mid[num] then ins(l,r,right[num]) else
begin
ins(l,mid[num],left[num]);
ins(mid[num]+1,r,right[num]);
end;
data[num]:=max(data[left[num]],data[right[num]]);
end;
begin
for i:=1 to 300000 do data[i]:=-2000000000;
read(n);
for i:=1 to n do read(hx[i]);
p:=0;q:=1;xd[1,1]:=1;xd[1,2]:=n;
while p<q do
begin
inc(p);
t:=(xd[p,1]+xd[p,2]) shr 1;
mid[p]:=t;
if xd[p,1]<xd[p,2] then
begin
inc(q);father[q]:=p;left[p]:=q;
xd[q,1]:=xd[p,1];xd[q,2]:=t;
inc(q);father[q]:=p;right[p]:=q;
xd[q,1]:=t+1;xd[q,2]:=xd[p,2];
end else
data[p]:=hx[xd[p,1]];
end;
for i:=q downto 2 do if data[i]>data[father[i]] then data[father[i]]:=data[i];
fillchar(delta,sizeof(delta),0);
read(m);
for i:=1 to m do
begin
read(k);
if k=2 then
begin
read(l,r);
write(ask_max(l,r,1),' ');
end;
if k=1 then
begin
read(l,r,d);
ins(l,r,1);
end;
end;
writeln;
end.
father,left,right,data,delta,mid:array[0..300000] of longint;
xd:array[0..300000,1..2] of longint;
hx:array[0..100000] of longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
function ask_max(l,r,num:longint):longint;
begin
if (l=xd[num,1])and(r=xd[num,2]) then exit(data[num]);
if r<=mid[num] then ask_max:=ask_max(l,r,left[num]) else
if l>mid[num] then ask_max:=ask_max(l,r,right[num]) else
ask_max:=max(ask_max(l,mid[num],left[num]),ask_max(mid[num]+1,r,right[num]));
inc(ask_max,delta[num]);
end;
procedure ins(l,r,num:longint);
begin
if (l=xd[num,1])and(r=xd[num,2]) then
begin
inc(delta[num],d);inc(data[num],d);exit;
end;
if delta[num]<>0 then
begin
inc(delta[left[num]],delta[num]);inc(delta[right[num]],delta[num]);
inc(data[left[num]],delta[num]);inc(data[right[num]],delta[num]);
delta[num]:=0;
end;
if r<=mid[num] then ins(l,r,left[num]) else
if l>mid[num] then ins(l,r,right[num]) else
begin
ins(l,mid[num],left[num]);
ins(mid[num]+1,r,right[num]);
end;
data[num]:=max(data[left[num]],data[right[num]]);
end;
begin
for i:=1 to 300000 do data[i]:=-2000000000;
read(n);
for i:=1 to n do read(hx[i]);
p:=0;q:=1;xd[1,1]:=1;xd[1,2]:=n;
while p<q do
begin
inc(p);
t:=(xd[p,1]+xd[p,2]) shr 1;
mid[p]:=t;
if xd[p,1]<xd[p,2] then
begin
inc(q);father[q]:=p;left[p]:=q;
xd[q,1]:=xd[p,1];xd[q,2]:=t;
inc(q);father[q]:=p;right[p]:=q;
xd[q,1]:=t+1;xd[q,2]:=xd[p,2];
end else
data[p]:=hx[xd[p,1]];
end;
for i:=q downto 2 do if data[i]>data[father[i]] then data[father[i]]:=data[i];
fillchar(delta,sizeof(delta),0);
read(m);
for i:=1 to m do
begin
read(k);
if k=2 then
begin
read(l,r);
write(ask_max(l,r,1),' ');
end;
if k=1 then
begin
read(l,r,d);
ins(l,r,1);
end;
end;
writeln;
end.