#include <bits/stdc++.h>
#define maxN 100002
#define lson (node << 1) + 1
#define rson (node << 1) + 2
#define inf 1000000002
FILE *fin = freopen("arbint.in", "r", stdin);
FILE *fout = freopen("arbint.out", "w", stdout);
using namespace std;
int N, M, a[maxN];
int ST[maxN];
void build(int node, int left, int right){
if(left == right)
ST[node] = a[left];
else{
int mid = (left + right) / 2;
build(lson, left, mid);
build(rson, mid + 1, right);
ST[node] = max(ST[lson], ST[rson]);
}
}
void update(int node, int left, int right, int pos, int value){
if(left == right)
ST[node] = value;
else{
int mid = (left + right) / 2;
if(pos <= mid)
update(lson, left, mid, pos, value);
else update(rson, mid + 1, right, pos, value);
ST[node] = max(ST[lson], ST[rson]);
}
}
int query(int node, int left, int right, int x, int y){
if(x <= left && right <= y)
return ST[node];
else{
int mid = (left + right) / 2, ans = -inf;
if(x <= mid)
ans = max(ans, query(lson, left, mid, x, y));
if(y > mid)
ans = max(ans, query(rson, mid + 1, right, x, y));
return ans;
}
}
int main(){
scanf("%d %d", &N, &M);
for(int i = 1; i <= N; ++ i)
scanf("%d", &a[i]);
build(0, 1, N);
while(M --){
int type, a, b;
scanf("%d %d %d", &type, &a, &b);
if(type == 0)
printf("%d\n", query(0, 1, N, a, b));
else update(0, 1, N, a, b);
}
return 0;
}