#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int l, r;
long long sum, lazy;
}tree[800005];
int a[200005];
void pushup(int id){
tree[id].sum = max(tree[id * 2].sum, tree[id * 2 + 1].sum);
}
void pushdown(int id){
long long lazytag = tree[id].lazy;
if(lazytag){
tree[id * 2].sum += (tree[id * 2].r - tree[id * 2].l + 1) * lazytag;
tree[id * 2].lazy += lazytag;
tree[id * 2 + 1].sum += (tree[id * 2 + 1].r - tree[id * 2 + 1].l + 1) * lazytag;
tree[id * 2 + 1].lazy += lazytag;
tree[id].lazy = 0;
}
}
void build(int id, int l, int r){
tree[id].l = l;
tree[id].r = r;
tree[id].sum = 0;
tree[id].lazy = 0;
if(l == r){
tree[id].sum = a[l];
}
else{
int mid = (l + r) / 2;
build(id * 2, l, mid);
build(id * 2 + 1, mid + 1, r);
pushup(id);
}
}
void update(int id, int l, int r, long long val)
{
if(l <= tree[id].l && tree[id].r <= r) {
tree[id].sum += (tree[id].r - tree[id].l + 1) * val;
tree[id].lazy += val;
}
else {
pushdown(id);
int mid = (tree[id].l+tree[id].r) / 2;
if(mid >= l){
update(id * 2, l, r, val);
}
if(r > mid){
update(id * 2 + 1, l, r, val);
}
pushup(id);
}
}
long long query(int id, int l, int r)
{
if(l <= tree[id].l && tree[id].r <= r) {
return tree[id].sum;
}
else {
pushdown(id);
long long ans = 0;
int mid = (tree[id].l + tree[id].r) / 2;
if(mid >= l){
ans = max(ans, query(id * 2, l, r));
}
if(r > mid){
ans = max(ans, query(id * 2 + 1, l, r));
}
pushup(id);
return ans;
}
}
signed main(){
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
build(1, 1, n);
for(int i = 1; i <= m; i++){
// cout<<i<<endl;
char op;
cin >> op;
if(op == 'U'){
int x, y;
cin >> x >> y;
update(1, x, x, y - a[x]);
a[x] = y;
}else{
int x, y;
cin >> x >> y;
cout<<query(1,x,y)<<endl;;
}
}
return 0;
}