import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); int arr[] = new int[n + 1]; int num = sc.nextInt(); int tree[] = new int[(n + 5) * 4 + 1]; for (int i = 1; i <= n; i++) { arr[i] = sc.nextInt(); } create_tree(tree, arr, 0, 1, n); for (int i = 0; i < num; i++) { String s = sc.next(); int a = sc.nextInt(); int b = sc.nextInt(); if (s.equals("Q")) { System.out.println(querey(tree, arr, 0, 1, n, a, b)); } else update(tree, arr, 0, 1, n, a, b); } } } public static void create_tree(int tree[], int arr[], int node, int start, int end) { if (start == end) tree[node] = arr[start]; else { int mid = (start + end) / 2; int left_node = node * 2 + 1; int right_node = node * 2 + 2; create_tree(tree, arr, left_node, start, mid); create_tree(tree, arr, right_node, mid + 1, end); tree[node] = Math.max(tree[left_node], tree[right_node]); } } public static void update(int tree[], int arr[], int node, int start, int end, int idx, int val) { if (start == end) { arr[start] = val; tree[node] = val; } else { int mid = (start + end) / 2; int left_node = node * 2 + 1; int right_node = node * 2 + 2; if (start <= idx && idx <= mid) update(tree, arr, left_node, start, mid, idx, val); else if(idx = mid+1) update(tree, arr, right_node, mid + 1, end, idx, val); tree[node] = Math.max(tree[left_node], tree[right_node]); } } public static int querey(int tree[], int arr[], int node, int start, int end, int L, int R) { if (start > R || end < L) return 0; else if (start >= L && R >= end) return tree[node]; else if (start == end) return tree[node]; else { int mid = (start + end) / 2; int left_node = node * 2 + 1; int right_node = node * 2 + 2; int max_left = querey(tree, arr, left_node, start, mid, L, R); int max_right = querey(tree, arr, right_node, mid + 1, end, L, R); return Math.max(max_left, max_right); } } }