#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[4*100001],n,m,op;
int a[100001];
void create_arbore(int st, int dr, int nod)
{
if(st == dr)
{
v[nod] = a[st];
return;
}
int m = (st+dr)/2;
create_arbore(st,m,2*nod);
create_arbore(m+1,dr,2*nod+1);
v[nod] = max(v[2*nod],v[2*nod+1]);
}
void update(int x, int y,int st, int dr,int nod)
{
if(st>x)
return;
if(dr<x)
return;
if(st == dr)
{
v[nod] = y;
while(nod)
{
nod>>=1;
v[nod] = max(v[2*nod+1],v[2*nod]);
}
return;
}
int m = (st+dr)/2;
update(x,y,st,m,2*nod);
update(x,y,m+1,dr,2*nod+1);
}
int query(int qst, int qdr,int st, int dr,int nod)
{
if(qst <= st && qdr >= dr)
return v[nod];
if(qst > dr || qdr < st)
return -1;
int m = (st+dr)/2;
return max( query(qst,qdr,st,m,2*nod), query(qst,qdr,m+1,dr,2*nod+1) );
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>a[i];
create_arbore(1,n,1);
for(int i=1;i<=m;i++)
{
int x,y;
fin>>op>>x>>y;
if(op==0)
fout<<query(x,y,1,n,1)<<'\n';
else update(x,y,1,n,1);
}
fin.close();
fout.close();
return 0;
}