#include<bits/stdc++.h>
#define mid ((l + r) >> 1)
using namespace std;
const int N = 4e6 + 9,INF = 0x3f3f3f;
int n,m;
int a[N];
struct node{
int val;
int sum,Max,lsum,rsum;
int pri;
int lc,rc;
int siz;
int rev_tag,mod_tag;
} t[N];
int node_cnt,root;
void push_up(int u){
t[u].siz = t[t[u].lc].siz + t[t[u].rc].siz + 1;
t[u].sum = t[t[u].lc].sum + t[t[u].rc].sum + t[u].val;
t[u].Max = max(t[u].val + t[t[u].lc].rsum + t[t[u].rc].lsum,t[u].val);
if(t[u].lc)
t[u].Max = max(t[u].Max,t[t[u].lc].Max);
if(t[u].rc)
t[u].Max = max(t[u].Max,t[t[u].rc].Max);
t[u].lsum = max(max(t[t[u].lc].lsum,t[t[u].lc].sum + t[u].val + t[t[u].rc].lsum),0);
t[u].rsum = max(max(t[t[u].rc].rsum,t[t[u].rc].sum + t[u].val + t[t[u].lc].rsum),0);
}
void make_rev_tag(int u){
t[u].rev_tag ^= 1;
swap(t[u].lc,t[u].rc);
swap(t[u].lsum,t[u].rsum);
}
void make_mod_tag(int u,int v){
t[u].val = t[u].mod_tag = v;
t[u].sum = v * t[u].siz;
t[u].Max = max(v,t[u].sum);
t[u].lsum = t[u].rsum = max(t[u].sum,0);
}
void push_down(int u){
if(t[u].rev_tag){
make_rev_tag(t[u].lc);
make_rev_tag(t[u].rc);
t[u].rev_tag = 0;
}
if(t[u].mod_tag != -INF){
make_mod_tag(t[u].lc,t[u].mod_tag);
make_mod_tag(t[u].rc,t[u].mod_tag);
t[u].mod_tag = -INF;
}
}
void split(int u,int x,int &L,int &R){
if(u == 0){
L = R = 0;
return;
}
push_down(u);
if(t[t[u].lc].siz < x){
L = u;
split(t[u].rc,x - t[t[u].lc].siz - 1,t[u].rc,R);
}
else{
R = u;
split(t[u].lc,x,L,t[u].lc);
}
push_up(u);
}
int merge(int u,int v){
if(!u || !v)
return u | v;
push_down(u);
push_down(v);
if(t[u].pri > t[v].pri){
t[u].rc = merge(t[u].rc,v);
push_up(u);
return u;
}
else{
t[v].lc = merge(u,t[v].lc);
push_up(v);
return v;
}
}
int new_node(int x){
t[++node_cnt] = (node){
x,
x,x,max(x,0),max(x,0),
rand() * rand(),
0,0,
1,
0,-INF
};
return node_cnt;
}
int build(int l,int r){
if(l == r)
return new_node(a[l]);
int u = merge(build(l,mid),build(mid + 1,r));
return u;
}
void Insert(int pos,int tot){
int u,v;
split(root,pos,u,v);
for(int i = 1;i <= tot;i++)
cin >> a[i];
root = merge(merge(u,build(1,tot)),v);
}
void Delete(int l,int r){
int u,v,w;
split(root,r,u,w);
split(u,l - 1,u,v);
root = merge(u,w);
}
void Modify(int l,int r,int k){
int u,v,w;
split(root,r,u,w);
split(u,l - 1,u,v);
make_mod_tag(v,k);
root = merge(merge(u,v),w);
}
void Reverse(int l,int r){
int u,v,w;
split(root,r,u,w);
split(u,l - 1,u,v);
make_rev_tag(v);
root = merge(merge(u,v),w);
}
int query_sum(int l,int r){
int u,v,w;
split(root,r,u,w);
split(u,l - 1,u,v);
int ret = t[v].sum;
root = merge(merge(u,v),w);
return ret;
}
int query_Max(int l,int r){
int u,v,w;
split(root,r,u,w);
split(u,l - 1,u,v);
int ret = t[v].Max;
root = merge(merge(u,v),w);
return ret;
}
signed main(){
srand(time(0));
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n;
for(int i = 1;i <= n;i++)
cin >> a[i];
root = merge(root,build(1,n));
cin >> m;
while(m--){
string op;
int pos,l,r;
cin >> op;
if(op == "I"){
cin >> pos;
Insert(pos,1);
}
else if(op == "D"){
cin >> pos;
Delete(pos,pos);
}
else if(op == "R"){
int v;
cin >> pos >> v;
Modify(pos,pos,v);
}
else if(op == "Q"){
cin >> l >> r;
cout << query_Max(l,r) << '\n';
}
}
return 0;
}