#include <fstream>
#define lim 100000
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int v[lim+5];
int aint[4*lim+5];
int n,m;
void build(int nod, int st, int dr)
{
if(st>dr) return;
if(st==dr)
aint[nod] = v[st];
else
{
int mij = (st+dr)/2;
build(2*nod, st, mij);
build(2*nod+1, mij+1, dr);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
}
void update(int nod, int st, int dr, int poz, int val)
{
if(st>dr || poz<st || poz>dr) return;
if(st==dr)
aint[nod]=val;
else
{
int mij = (st+dr)/2;
update(2*nod, st, mij, poz, val);
update(2*nod+1, mij+1, dr, poz, val);
aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}
}
int query(int nod, int st, int dr, int ql, int qr)
{
if(st>dr || qr<st || ql>dr) return -1;
if(ql <= st && qr >= dr)
return aint[nod];
else
{
int mij = (st+dr)/2;
int ansleft = query(2*nod, st, mij, ql, qr);
int ansright = query(2*nod+1, mij+1, dr, ql, qr);
return max(ansleft, ansright);
}
}
int main()
{
int t,a,b;
in>>n>>m;
for(int i=1; i<=n; i++) in>>v[i];
build(1,1,n);
for(int i=1; i<=m; i++)
{
in>>t>>a>>b;
if(t==0) out<<query(1,1,n,a,b)<<'\n';
else update(1,1,n,a,b);
}
return 0;
}