#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;
const int maxn = 1e5 + 10;
const int INF = 2e9;
struct node {
    int a, b;
    node () {}
    node(int _a, int _b) {
        a = _a;
        b = _b;
    }
};
void merge_node(node & tree_node, node & L, node & R) {
    vector<int> v{L.a, L.b, R.a, R.b};
    sort(v.begin(), v.end());
    tree_node = node(v[2], v[3]);
}
node merge_query(node L, node R) {
    vector<int> v{L.a, L.b, R.a, R.b};
    sort(v.begin(), v.end());
    return node(v[2], v[3]);
}
int arr[maxn];
node segment_tree[3 * maxn];

void build_tree(int L, int R, int position) {
    if(L == R) {
        segment_tree[position] = node(arr[L], -INF);
    }
    else {
        int middle = (L + R) / 2;
        build_tree(L, middle, 2 * position);
        build_tree(middle + 1, R, 2 * position + 1);
        merge_node(segment_tree[position], segment_tree[2 * position], segment_tree[2 * position + 1]);
    }
}
// L R i L R j L R
node query(int L, int R, int position, int i, int j) {
    if(i <= L and R <= j) {
        return segment_tree[position];
    }
    if(R < i or j < L) {
        return node(-INF, -INF);
    }
    int middle = (L + R) / 2;
    return merge_query(query(L, middle, 2 * position, i, j), query(middle + 1, R, 2 * position + 1, i, j));
}
void update(int L, int R, int position, int idx, node new_value) {
    if(L == R) {
        segment_tree[position] = new_value;
        return;
    }
    int middle = (L + R) / 2;
    if(idx <= middle) {
        update(L, middle, 2 * position, idx, new_value);
    }
    else {
        update(middle + 1, R, 2 * position + 1, idx, new_value);
    }
    merge_node(segment_tree[position], segment_tree[2 * position], segment_tree[2 * position + 1]);
}
int main() {
    ios_base::sync_with_stdio(false);
    int n;
    cin >> n;
    
    for(int i = 0; i < n; i++) {
        cin >> arr[i];
    }
    build_tree(0, n - 1, 1);
    
    int q;
    cin >> q;
    
    for(int i = 0; i < q; i++) {
        char c;
        cin >> c;
        
        if(c == 'U') {
            int idx, new_value;
            cin >> idx >> new_value;
            idx--;
            update(0, n - 1, 1, idx, node(new_value, -INF));
        }
        else {
            int a, b;
            cin >> a >> b;
            a--; b--;
            
            node tmp = query(0, n - 1, 1, a, b);
            cout << tmp.a + tmp.b << endl;
            
        }
    }
    
    return 0;
}
