#include<fstream>
using namespace std;
int n,m,x,y,z;
struct nod{int Max,st,dr;nod *l,*r;} *b;
ifstream f("arbint.in");
ofstream g("arbint.out");
void arb(nod *p,int st,int dr)
{p->Max=0;
p->st=st;
p->dr=dr;
if(st<dr)
{p->l=new nod;
arb(p->l,st,(st+dr)/2);
p->r=new nod;
arb(p->r,(st+dr)/2+1,dr);
}
}
int t(nod *p,int x,int y)
{if(x<=p->st&&p->dr<=y)
return p->Max;
else
{int Max=0;
if(x<=(p->st+p->dr)/2)
Max=max(Max,t(p->l,x,y));
if(y>(p->st+p->dr)/2)
Max=max(Max,t(p->r,x,y));
return Max;
}
}
void o(nod *p,int x,int y)
{if(p->st==p->dr)
p->Max=y;
else
{if(x<=(p->st+p->dr)/2)
o(p->l,x,y);
else
o(p->r,x,y);
p->Max=max(p->l->Max,p->r->Max);
}
}
int main()
{f>>n>>m;
b=new nod;
arb(b,1,n);
for(int i=1;i<=n;i++)
{f>>x;
o(b,i,x);
}
for(int i=1;i<=m;i++)
{f>>x>>y>>z;
if(x)
o(b,y,z);
else
g<<t(b,y,z)<<'\n';
}
}