#include <cstdio>
#include <algorithm>
#define N 100010
using namespace std;
int A[N],n,i,key,a,b,m;
struct Nod
{
Nod *left,*right,*dad;
int val;
};
Nod *root,*nl,*nr;
void Build(int low,int high,Nod *nod)
{
int midle=(high+low)>>1;
if(low==high)
{
nod->val=A[low];
return;
}
else
{
nl=new Nod;
nr=new Nod;
nod->left=nl;
nod->right=nr;
Build(low,midle,nod->left);
Build(midle+1,high,nod->right);
nod->val=(nod->left)->val>(nod->right)->val?(nod->left)->val:(nod->right)->val;
}
}
int Query(int low,int high,Nod *nod)
{
int midle=(high+low)>>1;
if(high<a||low>b)
return 0;
if(low>=a&&high<=b)
return nod->val;
return max(Query(low,midle,nod->left),Query(midle+1,high,nod->right));
}
int Update(int low,int high,Nod *nod)
{
int midle=(high+low)>>1;
if(low==high&&low==a)
nod->val=b;
if(low==high)
return nod->val;
nod->val=max(Update(low,midle,nod->left),Update(midle+1,high,nod->right));
return nod->val;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&A[i]);
root=new Nod;
Build(1,n,root);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&key,&a,&b);
if(key)
{
A[a]=b;
Update(1,n,root);
}
else
printf("%d\n",Query(1,n,root));
}
return 0;
}