#include <iostream>
#include <fstream>
using namespace std;
int v[100001];
int s[400001];
int n,i,m,a,b,c;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void maketree(int i, int p, int q)
{
if(p==q)
{
s[i]=v[p];
}
else
{
int m=(p+q)/2;
maketree(i*2,p,m);
maketree(i*2+1,m+1,q);
s[i]=max(s[2*i],s[2*i+1]);
}
}
int maxx(int i, int left, int right, int ls, int rd)
{
if(ls<=left && rd>=right)
return s[i];
else
if (ls>right || rd<left)
return 0;
else
{
int mij=(left+right)/2;
long long l=maxx(2*i,left,mij,ls,rd);
long long r=maxx(2*i+1,mij+1,right,ls,rd);
return max(l, r);
}
}
void update(int i, int p, int q, int a)
{
if(p==q)
s[i]=v[p];
else
{
int m=(p+q)/2;
if(a<=m)
update(2*i,p,m,a);
else update(2*i+1,m+1,q,a);
s[i]=max(s[2*i], s[2*i+1]);
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i];
maketree(1,1,n);
for(i=1;i<=m;i++)
{
fin>>c>>a>>b;
if(c==0)
fout<<maxx(1, 1, n, a, b)<<endl;
else
{
v[a]=b;
update(1,1,n,a);
}
}
return 0;
}