#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int lim=1e5+4;
int tree[4*lim];
int v[lim];
void build(int nod,int l,int r)
{
if(l==r) {tree[nod]=v[l];return;}
int med=(l+r)/2;
build(2*nod,l,med);
build(2*nod+1,med+1,r);
tree[nod]=max(tree[2*nod],tree[2*nod+1]);
}
void update(int nod,int l,int r,int a)
{
if(l==r) {tree[nod]=v[l];return;}
int med=(l+r)/2;
if(a<=med) update(2*nod,l,med,a);
else update(2*nod+1,med+1,r,a);
tree[nod]=max(tree[2*nod],tree[2*nod+1]);
}
int query(int nod,int l,int r,int a,int b)
{
if(a<=l and r<=b) return tree[nod];
int med=(l+r)/2,ans1=0,ans2=0;
if(a<=med) ans1=query(2*nod,l,med,a,b);
if(b>med) ans2=query(2*nod+1,med+1,r,a,b);
return max(ans1,ans2);
}
int main()
{
int n,q,t,a,b;
in>>n>>q;
for(int i=1;i<=n;++i)
in>>v[i];
build(1,1,n);
while(q--)
{
in>>t>>a>>b;
if(t==0) out<<query(1,1,n,a,b)<<'\n';
else v[a]=b,update(1,1,n,a);
}
return 0;
}