#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int m,n,a[400002],vl,q,z;
int buildtree(int x,int l,int r)
{
int lr=(l+r)/2;
if(l==r)f>>a[x];
else {a[x]=buildtree(2*x,l,lr);a[x]=max(a[x],buildtree(2*x+1,lr+1,r));}
return a[x];
}
int qr(int x,int l,int r,int b,int e)
{
if(b<=l&&e>=r)return a[x];
int mx=0,lr=(l+r)/2;
if(b<=lr)mx=qr(2*x,l,lr,b,e);
if(e>lr)mx=max(mx,qr(2*x+1,lr+1,r,b,e));
return mx;
}
void upd(int x,int l,int r,int dst)
{
if(r==l){a[x]=vl;return;}
int lr=(l+r)/2;
if(dst<=lr)upd(2*x,l,lr,dst);
else if(dst>lr)upd(2*x+1,lr+1,r,dst);
a[x]=max(a[2*x],a[2*x+1]);
}
int main()
{
f>>n>>m;
buildtree(1,1,n);
for(;m>0;--m)
{
f>>q>>z>>vl;
if(q==0)g<<qr(1,1,n,z,vl)<<'\n';
else upd(1,1,n,z);
}
}