#include <iostream> #include <bits/stdc++.h> #define maxn 800005 using namespace std; typedef long long ll; ll tree[maxn]={0}; ll lazy[maxn]={0}; ll a[200005]={0}; int n; void pushup(int rt) { tree[rt]=max(tree[rt*2],tree[rt*2+1]); } void buildtree(int l,int r,int rt) { if(l==r) { tree[rt]=a[l]; return; } int mid=(l+r)/2; buildtree(l,mid,rt*2); buildtree(mid+1,r,rt*2+1); pushup(rt); } void pushdown(int rt) { if(lazy[rt]) { lazy[rt*2]+=lazy[rt]; lazy[rt*2+1]+=lazy[rt]; tree[rt*2]+=lazy[rt]; tree[rt*2+1]+=lazy[rt]; lazy[rt]=0; } } void add(int l,int r,int L,int R,int rt,int val) { if(L<=l&&R>=r) { lazy[rt]+=val; tree[rt]+=val; return; } if(lazy[rt]) pushdown(rt); int mid=(l+r)/2; if(L<=mid) add(l,mid,L,R,rt*2,val); if(R>mid) add(mid+1,r,L,R,rt*2+1,val); pushup(rt); } ll query(int l,int r,int L,int R,int rt) { if(L<=l&&R>=r) { return tree[rt]; } int mid=(l+r)/2; pushdown(rt); ll ret=1e9; if(L<=mid) ret=query(l,mid,L,R,rt*2); if(R>mid) ret=max(ret,query(mid+1,r,L,R,rt*2+1)); return ret; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } buildtree(1,n,1); int m; scanf("%d",&m); for(int i=1;i<=m;i++) { char c; scanf("%c",&c); if(c=='a') { int x,y,val; scanf("%d%d%d",&x,&y,&val); add(1,n,x,y,1,val); } else if(c=='q') { int x,y; scanf("%d%d",&x,&y); cout<<query(1,n,x,y,1)<<endl; } } return 0; }