#include <fstream>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int tree[4*100000+5];
int N,M,maxi,mid,val,a,b,op;
void update(int node,int left,int right,int pos,int val) {
if (left==right) {
tree[node]=val;
return;
}
mid=left+(right-left)/2;
if (pos<=mid)
update(2*node,left,mid,pos,val);
else
update(2*node+1,mid+1,right,pos,val);
tree[node]=max(tree[2*node],tree[2*node+1]);
}
void query(int node,int left,int right,int a,int b) {
if (a<=left && right<=b) {
maxi=max(tree[node],maxi);
return;
}
mid=left+(right-left)/2;
if (a<=mid) query(2*node,left,mid,a,b);
if (b>mid) query(2*node+1,mid+1,right,a,b);
}
int main() {
in>>N>>M;
for (int i=1;i<=N;i++) {
in>>val;
update(1,1,N,i,val);
}
for (int i=1;i<=M;i++) {
in>>op>>a>>b;
if (op==0) {
maxi=-1;
query(1,1,N,a,b);
out<<maxi<<"\n";
}
if (op==1) {
update(1,1,N,a,b);
}
}
return 0;
}