#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m,v[100005],a[500005],i,p,b,c;
void build(int nod, int st, int dr){
if(st == dr){
a[nod] = v[st];
return;
}
int mij = (st + dr) >> 1;
build(2*nod,st,mij);
build(2*nod+1,mij+1,dr);
a[nod] = max(a[2*nod],a[2*nod+1]);
}
void update(int nod, int st, int dr, int val, int pos){
if(st == dr){
a[nod] = val;
return;
}
int mij = (st + dr) >> 1;
if(pos <= mij)
update(2*nod,st,mij,val,pos);
else
update(2*nod+1,mij+1,dr,val,pos);
a[nod] = max(a[2*nod],a[2*nod+1]);
}
int querry(int nod, int st, int dr, int st2, int dr2){
if(st2 <= st && dr <= dr2){
return a[nod];
}
else{
int mij = (st + dr) >> 1;
int maxstanga = 0;
int maxdreapta = 0;
if(st2 <= mij)
maxstanga = querry(2*nod,st,mij,st2,dr2);
if(dr2 > mij)
maxdreapta = querry(2*nod+1,mij+1,dr,st2,dr2);
return max(maxstanga,maxdreapta);
}
}
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>>p>>b>>c;
if(p == 1)
update(1,1,n,c,b);
else
fout << querry(1,1,n,b,c) << '\n';
}
return 0;
}