1 /*
2 区间单点该值,区间查询最大值;
3 hdu-1754
4 */
5 #include<iostream>
6 #include<cstdio>
7 #include<cstring>
8 using namespace std;
9 typedef struct
10 {
11 int l,r;
12 int value;
13 }V;
14 int n,m,a[200005]={0},MAX=-1;
15 V tr[800005]={0};
16 void build(int i,int l,int r)
17 {
18 tr[i].l=l;
19 tr[i].r=r;
20 if(l==r)
21 {
22 tr[i].value=a[l];
23 return ;
24 }
25 int mid=(l+r)/2;
26 build(i<<1,l,mid);
27 build(i<<1|1,mid+1,r);
28 tr[i].value=max(tr[i<<1].value,tr[i<<1|1].value);
29 }
30 void Query(int i,int l,int r)
31 {
32 if(tr[i].l==l&&tr[i].r==r)
33 {
34 MAX=MAX>=tr[i].value?MAX:tr[i].value;
35 return ;
36 }
37 i=i<<1;
38 if(l<=tr[i].r)
39 {
40 if(r<=tr[i].r)
41 Query(i,l,r);
42 else
43 Query(i,l,tr[i].r);
44 }
45 i+=1;
46 if(r>=tr[i].l)
47 {
48 if(l>=tr[i].l)
49 Query(i,l,r);
50 else
51 Query(i,tr[i].l,r);
52 }
53 }
54 void Update(int i,int l,int x)
55 {
56 if(tr[i].l==tr[i].r&&tr[i].l==l)
57 {
58 tr[i].value=x;
59 return ;
60 }
61 int t=i<<1;
62 if(l<=tr[t].r)
63 Update(t,l,x);
64 t+=1;
65 if(l>=tr[t].l)
66 Update(t,l,x);
67 tr[i].value=max(tr[i<<1].value,tr[i<<1|1].value);
68 }
69 int main()
70 {
71 while(scanf("%d%d",&n,&m)!=EOF)
72 {
73 memset(a,0,sizeof(a));
74 for(int i=1;i<=n;i++)
75 {
76 scanf("%d",&a[i]);
77 }
78 build(1,1,n);
79 /* for(int i=1;i<11;i++)
80 printf("I:%d %d\n",i,tr[i].value);
81 */ char s;
82 int x1,x2;
83 while(m--)
84 {
85 getchar();
86 scanf("%c%d%d",&s,&x1,&x2);
87 if(s=='Q')
88 {
89 MAX=-1;
90 Query(1,x1,x2);
91 printf("%d\n",MAX);
92 }
93 else
94 {
95 Update(1,x1,x2);
96 }
97 }
98 }
99 return 0;
100 }