#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int MAXN=100010;
int aint[4*MAXN],n,q;
void Update (int val, int pos, int l, int r, int node){
if (l==r){
aint[node]=val;
return;
}
int mij=(l+r)/2;
if (mij<pos)
Update (val,pos,mij+1,r,node*2+1);
else
Update (val,pos,l,mij,node*2);
aint[node]=max (aint[2*node],aint[2*node+1]);
}
int Query (int node, int ql, int qr, int l, int r){
if (l>qr || r<ql || l>r)
return -1;
if (ql<=l && r<=qr)
return aint[node];
int mij=(l+r)/2;
int rezl=Query (2*node,ql,qr,l,mij);
int rezr=Query (2*node+1,ql,qr,mij+1,r);
return max (rezl,rezr);
}
int main()
{
fin >>n>>q;
for (int i=1;i<=n;++i){
int x;
fin >>x;
Update (x,i,1,n,1);
}
for (int i=1;i<=q;++i){
int tip,a,b;
fin >>tip>>a>>b;
if (tip==0)
fout <<Query (1,a,b,1,n)<<'\n';
else
Update (b,a,1,n,1);
}
fin.close ();
fout.close ();
return 0;
}