#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
long long int n,m,i,c,x,y;
long long int v[NMAX];
long long int a[4*NMAX];
long long int query(long long int node,long long int x,long long int y,long long int st,long long int dr);
void build( int node, int st,int dr);
void update(long long int node,long long int x,long long int y,long long int st,long long int dr,long long int val);
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i];
build(1,1,n);
for(i=1;i<=m;i++)
{
fin>>c>>x>>y;
if(!c)
fout<<query(1,x,y,1,n)<<'\n';
else
{
update(1,x,x,1,n,y);
}
}
return 0;
}
void build( int node,int st,int dr)
{long long mj=(st+dr)/2;
if(st==dr)
{
a[node]=v[st];
return ;
}
build(2*node,st,mj);
build(2*node+1,mj+1,dr);
a[node]=max(a[2*node],a[2*node+1]);
}
void update(long long int node,long long int x,long long int y,long long int st,long long int dr,long long int val)
{
long long mj=(dr +st)/2;
if(x<=st && dr<=y )
{
///full range
a[node]=val;
return;
}
if(x<=mj)
update(2*node,x,y,st,mj,val);
if(y>mj)
update(2*node+1,x,y,mj+1,dr,val);
a[node]=max(a[2*node],a[2*node+1]);
}
long long int query(long long int node,long long int x,long long int y,long long int st,long long int dr)
{long long int mj=(st+dr)/2,ans1=0,ans2=0;
if(x<=st && dr<=y)
return a[node];
if(x<=mj)
ans1=query(2*node,x,y,st,mj);
if(y>mj)
ans2=query(2*node+1,x,y,mj+1,dr);
return max(ans1,ans2);
}