#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define cin fin
#define cout fout
const int Nmax=1e5+5;
int v[Nmax],tree[4*Nmax];
struct AINT
{
void build(int node, int l, int r)
{
if(l==r)
{
tree[node]=v[l];
}
else
{
int m=(l+r)/2;
build(node*2,l,m);
build(node*2+1,m+1,r);
tree[node]=max(tree[2*node],tree[2*node+1]);
}
}
int query(int node, int tl, int tr, int l, int r)
{
if(l>r) return 0;
if(tl==l && tr==r) return tree[node];
int tm=(tl+tr)/2;
return max(query(node*2,tl,tm,l,min(tm,r)),query(node*2+1,tm+1,tr,max(l,tm+1),r));
}
void update(int node,int tl,int tr,int poz, int val)
{
if(tl==tr)
{
tree[node]=val;
return;
}
else
{
int tm=(tl+tr)/2;
if(poz<=tm)
{
update(node*2,tl,tm,poz,val);
}
else
{
update(node*2+1,tm+1,tr,poz,val);
}
}
tree[node]=max(tree[node*2],tree[node*2+1]);
}
} aint;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>v[i];
aint.build(1,1,n);
while(m--)
{
int tip;
cin>>tip;
if(tip==0)
{
int l,r;
cin>>l>>r;
cout<<aint.query(1,1,n,l,r)<<"\n";
}
else
{
int idx,val;
cin>>idx>>val;
aint.update(1,1,n,idx,val);
}
}
return 0;
}