#include <bits/stdc++.h>
#define cin fin
#define cout fout
#define NMAX 100005
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
void build(int node,int st,int dr);
void update(int node,int st,int dr,int poz,int val);
int query(int node,int st,int dr,int l,int r);
int n,m,v[NMAX],op,a,b,tree[4*NMAX];
int main()
{
cin >> n >> m;
for(int i=1; i <= n; i++)
cin >> v[i];
build(1,1,n);
for(int i=1; i <= m; i++) {
cin >> op >> a >> b;
if(!op) {
cout << query(1,1,n,a,b) << '\n';
}
else
update(1,1,n,a,b);
}
return 0;
}
void build(int node,int st,int dr) {
if(st == dr) {
tree[node] = v[st];
}
else {
int mij = (st+dr)/2;
build(node*2,st,mij);
build(node*2+1,mij+1,dr);
tree[node] = max(tree[node*2],tree[node*2+1]);
}
}
void update(int node,int st,int dr,int poz,int val) {
if(st == dr) {
tree[node] = val;
}
else {
int mij = (st+dr)/2;
if(poz <= mij)
update(node*2,st,mij,poz,val);
else
update(node*2+1,mij+1,dr,poz,val);
tree[node] = max(tree[node*2],tree[node*2+1]);
}
}
int query(int node,int st,int dr,int l,int r) {
if (l<=st && dr<=r) {
return tree[node];
}
else {
int mij = (st+dr)/2;
if(r <= mij)
/// raspunsul la query ul meu se afla in totalitate pe copilul node*2
return query(node*2,st,mij,l,r);
else if(l > mij)
return query(node*2+1,mij+1,dr,l,r);
else
return max(query(node*2,st,mij,l,r),query(node*2+1,mij+1,dr,l,r));
}
}