#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int N=100000;
int n;
int A[3*N+5];
int q;
void update(int nod,int cine,int val,int st,int dr) {
if(cine<st || dr<cine)
return;
if(st==dr) {
A[nod]=val;
return;
}
int med=(st+dr)/2;
update(2*nod,cine,val,st,med);
update(2*nod+1,cine,val,med+1,dr);
A[nod]=max(A[2*nod],A[2*nod+1]);
}
int intrebare(int nod,int a,int b,int st,int dr) {
if(dr<a || b<st)
return 0;
if(a<=st && dr<=b)
return A[nod];
int med=(st+dr)/2;
return max(intrebare(2*nod,a,b,st,med),intrebare(2*nod+1,a,b,med+1,dr));
}
int main() {
fin>>n>>q;
for(int i=1;i<=n;i++) {
int foo;
fin>>foo;
update(1,i,foo,1,n);
}
while(q-- ){
int t,a,b;
fin>>t>>a>>b;
if(t==1)
update(1,a,b,1,n);
else {
fout<<intrebare(1,a,b,1,n)<<"\n";
}
}
return 0;
}