#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int maxArb[4*100101];
void Update(int nod, int left, int right, int pos, int val)
{
if(left == right)
{
maxArb[nod] = val;
return;
}
int div = (left + right ) / 2;
if(pos <= div) Update(2*nod,left,div,pos,val);
else Update(2*nod+1,div+1,right,pos, val);
maxArb[nod] = max(maxArb[2*nod],maxArb[2*nod+1]);
}
void Query(int nod, int left, int right, int &maxim, int a, int b)
{
if(a <= left && right <= b)
{
if(maxim < maxArb[nod])
maxim = maxArb[nod];
return;
}
int div = (left + right) / 2;
if(a <= div) Query(2*nod,left,div,maxim,a,b);
if(div < b) Query(2*nod+1,div+1,left,maxim,a,b);
}
int main()
{
int x, a, b;
fin >> n >> m;
for(int i = 1; i <= n; i++)
{
fin >> x;
Update(1,1,n,i,x);
}
for(int i = 1; i <= m; i++)
{
fin >> x >> a >> b;
if(x == 0)
{
int maxim = -1;
Query(1,1,n,maxim,a,b);
fout << maxim << "\n";
}
else
{
Update(1,1,n,a,b);
}
}
return 0;
}