#include <bits/stdc++.h>
using namespace std;
#define Nmax 400013
int Stree[Nmax],lazy[Nmax];
int n,i,a,b,c,j,k,l,m,value,op;
void update_tree (int nod, int st,int dr,int x, int y)
{
if (st>dr || st>y || dr<x) return;
if (st==dr)
{
Stree[nod]=value;
return;
}
update_tree(nod*2,st,(st+dr)/2,x,y);
update_tree(nod*2+1,(st+dr)/2+1,dr,x,y);
Stree[nod]=max(Stree[nod*2],Stree[nod*2+1]);
}
int query(int nod,int st,int dr,int x,int y)
{
if (st>dr || st>y || dr<x) return -1;
if (st>=x && dr<=y) return Stree[nod];
return max(query(nod*2,st,(st+dr)/2,x,y),query(nod*2+1,(st+dr)/2+1,dr,x,y));
}
int main(void)
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin>>n>>m;
for (i=1;i<=n;++i)
{
cin>>value;
update_tree(1,1,n,i,i);
}
for (;m>0;--m)
{
cin>>op>>a>>value;
if (op==0) cout<<query(1,1,n,a,value)<<"\n";
if (op==1) update_tree(1,1,n,a,a);
}
return 0;
}