#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
long long int aint[400001];
long long int v[400001];
void update(int st,int dr,int pos,int nod)
{
if(st == dr) aint[nod]=v[pos];
else
{
int mij = (st+dr)/2;
if(pos<=mij) update(st,mij,pos,2*nod);
else update(mij+1,dr,pos,2*nod+1);
aint[nod] = max(aint[2*nod],aint[2*nod+1]);
}
}
int query(int st,int dr, int p1, int p2, int nod)
{
// cout<<st<<" "<<dr<<" "<<p1<<" "<<p2<<"\n";
if(p1>p2) return 0;
if(st==p1 && dr == p2)
return aint[nod];
else
{
int mij= (st+dr)/2;
if(p2<=mij) return query(st,mij,p1,p2,2*nod);
else if(p1>mij) return query(mij+1,dr,p1,p2,2*nod+1);
else return max(query(st,mij,p1,mij,2*nod),query(mij+1,dr,mij+1,p2,2*nod+1));
}
}
int main()
{
long long int N,M,nr1,nr2;
int x;
fin>>N>>M;
int i;
for(i = 1; i <= N; i++)
{
fin>>v[i];
update(1,N,i,1);
}
for(i = 1; i <= M; i++)
{
fin>>x>>nr1>>nr2;
if(x == 1)
{
v[nr1]=nr2;
update(1,N,nr1,1);
}
else
{
fout<<query(1,N,nr1,nr2,1)<<"\n";
}
}
}