//P4314
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define LL long long
#define Lowbit(X) (X&(-X))
#define Lson (X<<1)
#define Rson (X<<1|1)
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define FOR_SIDE(i,A) for(LL i=Head[A];i;i=Next[i])
#define INF 0x7fffffff
using namespace std;
const LL MAXN=1e5+10;
LL Tag1[MAXN<<2],Tag2[MAXN<<2],Max[MAXN<<2],Pre[MAXN<<2];
LL Total,Test,u,v,w,Num[MAXN];
char Opt;
bool Jud[MAXN<<2];
inline void File() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
inline LL Read() {
LL Temp=0,Fac=1;
char Ch=getchar();
while(Ch<'0' || Ch>'9') {
if(Ch=='-') { Fac=-1; }
Ch=getchar();
}
while(Ch>='0' && Ch<='9') {
Temp=(Temp<<1)+(Temp<<3)+Ch-'0';
Ch=getchar();
}
return Fac*Temp;
}
inline void Push_up(LL X,LL L,LL R) {
Max[X]=max(Max[Lson],Max[Rson]);
Pre[X]=max(Pre[Lson],Pre[Rson]);
}
inline void Push_down(LL X,LL L,LL R) {
if(Tag2[X]!=-INF && !Jud[X]) {
Tag2[Lson]=Tag2[Rson]=Tag2[X];
Jud[Lson]=Jud[Rson]=false;
Max[Lson]=Max[Rson]=Tag2[X];
Pre[Lson]=max(Pre[Lson],Tag2[X]); Pre[Rson]=max(Pre[Rson],Tag2[X]);
Jud[X]=true;
} else if(Tag1[X]!=0) {
Tag1[Lson]+=Tag1[X]; Tag1[Rson]+=Tag1[X];
Max[Lson]+=Tag1[X]; Max[Rson]+=Tag1[X];
Pre[Lson]=max(Pre[Lson],Max[Lson]); Pre[Rson]=max(Pre[Rson],Max[Rson]);
Tag1[X]=0;
}
}
inline void Build(LL X,LL L,LL R) {
Tag1[X]=0; Tag2[X]=-INF; Jud[X]=false;
if(L==R) {
Pre[X]=Max[X]=Num[L];
return;
}
LL Mid=(L+R)>>1;
Build(Lson,L,Mid); Build(Rson,Mid+1,R);
Push_up(X,L,R);
}
inline void Add(LL X,LL L,LL R,LL From,LL To,LL Temp) {
// cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
// cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
// cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
// cout<<endl;
if(L>=From && R<=To) {
if(Tag2[X]!=-INF) { Tag2[X]+=Temp; Jud[X]=false; }
else { Tag1[X]+=Temp; }
Max[X]+=Temp;
Pre[X]=max(Pre[X],Max[X]+Temp);
return ;
}
LL Mid=(L+R)>>1;
Push_down(X,L,R);
if(From<=Mid) { Add(Lson,L,Mid,From,To,Temp); }
if(To>Mid) { Add(Rson,Mid+1,R,From,To,Temp); }
Push_up(X,L,R);
}
inline void Change(LL X,LL L,LL R,LL From,LL To,LL Temp) {
// cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
// cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
// cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
// cout<<endl;
if(L>=From && R<=To) {
Max[X]=Tag2[X]=Temp; Jud[X]=false;
Pre[X]=max(Pre[X],Temp);
Tag1[X]=0;
return;
}
LL Mid=(L+R)>>1;
Push_down(X,L,R);
if(From<=Mid) { Change(Lson,L,Mid,From,To,Temp); }
if(To>Mid) { Change(Rson,Mid+1,R,From,To,Temp); }
Push_up(X,L,R);
}
inline LL Get_MAX(LL X,LL L,LL R,LL From,LL To) {
// cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
// cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
// cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
// cout<<endl;
if(L>=From && R<=To) { return Max[X]; }
LL Mid=(L+R)>>1,Res=-INF;
Push_down(X,L,R);
if(From<=Mid) { Res=max(Res,Get_MAX(Lson,L,Mid,From,To)); }
if(To>Mid) { Res=max(Res,Get_MAX(Rson,Mid+1,R,From,To)); }
Push_up(X,L,R);
return Res;
}
inline LL Get_PRE(LL X,LL L,LL R,LL From,LL To) {
// cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
// cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
// cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
// cout<<endl;
if(L>=From && R<=To) { return Pre[X]; }
LL Mid=(L+R)>>1,Res=-INF;
Push_down(X,L,R);
if(From<=Mid) { Res=max(Res,Get_PRE(Lson,L,Mid,From,To)); }
if(To>Mid) { Res=max(Res,Get_PRE(Rson,Mid+1,R,From,To)); }
Push_up(X,L,R);
return Res;
}
inline void Debug(LL X,LL L,LL R) {
cout<<"X:"<<X<<" "<<"L:"<<L<<" "<<"R:"<<R<<endl;
cout<<"Tag1:"<<Tag1[X]<<" "<<"Tag2:"<<Tag2[X]<<endl;
cout<<"Max:"<<Max[X]<<" "<<"Pre:"<<Pre[X]<<endl;
cout<<endl;
if(L==R) return;
LL Mid=(L+R)>>1;
Debug(Lson,L,Mid); Debug(Rson,Mid+1,R);
}
int main() {
//File();
Total=Read();
FOR(i,1,Total) { Num[i]=Read(); }
Build(1,1,Total);
Test=Read();
while(Test--) {
Opt=getchar();
u=Read(); v=Read();
// printf("%c %lld %lld\n",Opt,u,v);
if(Opt=='Q') { printf("%lld\n",Get_MAX(1,1,Total,u,v)); }
else if(Opt=='A') { printf("%lld\n",Get_PRE(1,1,Total,u,v)); }
else if(Opt=='P') { w=Read(); Add(1,1,Total,u,v,w); }
else if(Opt=='C') { w=Read(); Change(1,1,Total,u,v,w); }
// Debug(1,1,Total);
}
//fclose(stdin); fclose(stdout);
system("pause");
return 0;
}