#include <cstring> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> #define N 100010 using namespace std; int a[N]; struct node { int l , r , lc , rc , c; }; node tr[N]; int len; int mymax(int x , int y) { return x > y ? x : y; } void bt(int l ,int r) { len++; int now = len; tr[now].l = l; tr[now].r = r; tr[now].lc = tr[now].rc = -1; if(l == r) tr[now].c = a[l]; else { int mid = (l + r) / 2; tr[now].lc = len + 1; bt(1 , mid); tr[now].rc = len + 1; bt(mid + 1 , r); tr[now].c = mymax(tr[tr[now].lc].c , tr[tr[now].rc].c); } } void change(int now , int x , int k) { if(tr[now].l == tr[now].r) { tr[now].c = k; return; } int lc = tr[now].lc,rc = tr[now].rc; int mid = (tr[now].l + tr[now].r) / 2; if(x <= mid) change(lc , x , k); else if(mid + 1 <= x) change(rc , x , k); tr[now].c = mymax(tr[lc].c , tr[rc].c); } int sum(int now , int l , int r) { if(l == tr[now].l && tr[now].r == r) return tr[now].c; int lc = tr[now].lc , rc = tr[now].rc; int mid = (tr[now].l + tr[now].r) / 2; int tot = 0; if(r <= mid) return sum(lc , l , r) else if(mid + 1 <= l) return sum(rc , l , r) else { for(int i = l ; i <= r ; i ++) tot += tr[i].c; return sum(lc , l , mid); } int findmax(int now , int l , int r) { if(l == tr[now].l && tr[now].r == r) return tr[now].c; int lc = tr[now].lc , rc = tr[now].rc; int mid = (tr[now].l + tr[now].r) / 2; if(r <= mid) return findmax(lc , l , r); else if(mid + 1 <= l) return findmax(rc , l , r); else return mymax(findmax(lc , l , mid) , findmax(rc , mid + 1 , r)); } int main() { int n , m , i , x , y; char ss[10]; scanf("%d%d",&n,&m); for(i = 1 ; i <= n ; i ++) scanf("%d",&a[i]); len = 0; bt(1 , n); for(i = 1 ; i <= m ; i ++) { scanf("%s%d%d",ss,&x,&y); if(ss[0] == ‘C‘) change(1 , x , y); else { if(x > y) printf("%d\n",findmax(1 , y , x)); else printf("%d\n",findmax(1 , x , y)); } } return 0; }