#include <iostream>
#include <fstream>
using namespace std;
//ifstream cin("arbint.in");
//ofstream cout("arbint.out");
struct aint {
aint *a, *b, *p;
int v, l, r;
aint(int x, int y, int z, aint *bb) {
v = x;
p = bb;
l = y;
r = z;
}
aint(){}
};
aint root;
int ls[100001];
aint *leaf[100001];
int build(aint &node, int l, int r){
if(l != r){
node.a = new aint(0, l, l + (r - l + 1)/2 - 1, &node);
node.b = new aint(0, l + (r - l + 1)/2, r, &node);
node.v = max(build(*node.a, node.a->l, node.a->r), build(*node.b, node.b->l, node.b->r));
return node.v;
}else{
node.v = ls[l];
leaf[l] = &node;
return node.v;
}
}
int getmax(aint &node, int l, int r){
if((r < node.l) || (l > node.r))
return 0;
else if((l == node.l) && (r == node.r))
return node.v;
else if(r <= node.a->r)
return getmax(*node.a, l, r);
else if(l >= node.b->l)
return getmax(*node.b, l, r);
else return max(getmax(*node.a, l, node.a->r), getmax(*node.b, node.b->l, r));
}
void update(aint *node, int change){
node->v = change;
node = node->p;
while(true){
node->v = max(node->a->v, node->b->v);
if(node->p == NULL)
break;
node = node->p;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, m;
cin>>n>>m;
for(int x = 1;x<=n;x++){
cin>>ls[x];
}
root = aint(0, 1, n, NULL);
build(root, 1, n);
for(int x = 1;x<=m;x++){
int r, a, b;
cin>>r>>a>>b;
if(r == 0){
cout<<getmax(root, a, b)<<'\n';
}else update(leaf[a], b);
}
return 0;
}