#include <bits/stdc++.h>
#define NMax 100005
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,l,r,sol,v,q,x;
int TR[NMax * 4];
void range_update(int node, int x,int y, int l, int r, int v){
if(l <= x && y <= r){
TR[node] = v;
}else{
int mid = (x + y) / 2;
if(l <= mid){
range_update(2 * node, x, mid, l , r, v);
}
if(r > mid){
range_update(2 * node + 1, mid + 1, y, l , r, v);
}
TR[node] = max(TR[2 * node], TR[2 * node + 1]);
}
}
void range_query(int node, int x, int y, int l, int r){
if(l <= x && y <= r){
sol = max(sol, TR[node]);
}else{
int mid = (x + y) / 2;
if(l <= mid){
range_query(2 * node, x, mid, l , r);
}
if(r > mid){
range_query(2 * node + 1, mid + 1, y, l , r);
}
}
}
int main()
{
f >> n >> m;
for(int i = 1; i <= n; ++i){
f >> v;
range_update(1,1,n,i,i,v);
}
for(int i = 1; i <= m; ++i){
f >> q;
if(q == 1){
f >> x >> v;
range_update(1,1,n,x,x,v);
}else{
f >> l >> r;
sol = -INF;
range_query(1,1,n,l,r);
g << sol << '\n';
}
}
return 0;
}