#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N,M;
int m[1<<18];
void up(int poz, int val,int l, int r, int nod)
{
int mid=(l+r)/2;
int son1=nod*2,son2=nod*2+1;
if(l==r)
{
m[nod]=val;
return;
}
if(poz<=mid)
up(poz,val,l,mid,son1);
else
up(poz,val,mid+1,r,son2);
m[nod]=max(m[son1],m[son2]);
return;
}
int querry(int x,int y,int l, int r, int nod)
{
int mid=(l+r)/2;
int son1=nod*2,son2=nod*2+1;
if((x<=l && y>=r) || (l>=r))
return m[nod];
else
{
int sol=0;
if(x<=mid)
sol=max(sol,querry(x,y,l,mid,son1));
if(y>mid)
sol=max(sol,querry(x,y,mid+1,r,son2));
return sol;
}
}
int main()
{
fin>>N>>M;
for(int i=1;i<=N;i++)
{
int x;
fin>>x;
up(i,x,1,N,1);
}
for(int i=1;i<=M;i++)
{
int op,x,y;
fin>>op>>x>>y;
if(!op)
{
fout<<querry(x,y,1,N,1)<<"\n";
}
else
{
up(x,y,1,N,1);
}
}
return 0;
}