#include <stdio.h> #include <string.h> const int MAXN = 200005; typedef struct { int l; int r; int max; }Node; Node seg[MAXN * 4]; int Max; int fmax(int x,int y) { return x > y ? x : y; } void build(int num,int l,int r) { seg[num].l = l; seg[num].r = r; seg[num].max = -1; if ( l == r ) return; int mid = ( l + r ) / 2; build(num * 2, l, mid); build(num * 2 + 1, mid + 1, r); } void update(int num,int id,int value) { if ( seg[num].l == id && seg[num].r == id ) { seg[num].max = value; return; } int mid = ( seg[num].l + seg[num].r ) / 2; if ( id <= mid ) update(num * 2, id, value); else update(num * 2 + 1, id, value); seg[num].max = fmax(value,seg[num].max); } void query(int num,int l,int r) { if ( seg[num].l == l && seg[num].r == r ) { Max = fmax(Max,seg[num].max); return; } int mid = ( seg[num].l + seg[num].r ) / 2; if ( r <= mid ) query(num * 2, l, r); else if ( mid + 1 <= l ) query(num * 2 + 1, l, r); else { query(num * 2, l, mid); query(num * 2 + 1, mid + 1, r); } } int main() { // freopen("1.txt","r",stdin); int N,M; while ( scanf("%d%d",&N,&M) == 2 ) { build(1,1,N); int mark; for (int i = 1; i <= N; i++) { scanf("%d",&mark); update(1,i,mark); } char a; int b,c; while ( M-- ) { getchar(); scanf("%c%d%d",&a,&b,&c); if ( a == 'Q' ) { Max = -1; query(1,b,c); printf("%d\n",Max); } else { update(1,b,c); } } } return 0; }