#include <cstdio>
#define nmax 505050
#include <algorithm>
using namespace std;
int arb[nmax], v[nmax];
int n, m, i, x, y, type;
int maxx;
int value, position;
int start, finish;
void tree_update(int node, int left, int right)
{
if(left==right)
{
arb[node]=value;
return;
}
else
{
int mid=(left+right)/2;
if(position<=mid) tree_update(2*node, left, mid);
else tree_update(2*node+1, mid+1, right);
}
arb[node]=max(arb[2*node], arb[2*node+1]);
}
void tree_query(int node, int left, int right)
{
if(start<=left && right<=finish)
{
maxx=max(maxx, arb[node]);
return;
}
else
{
int mid=(left+right)/2;
if(start<=mid) tree_query(2*node, left, mid);
if(mid<finish) tree_query(2*node+1, mid+1, right);
}
}
int main()
{
freopen("arbint.in", "rt", stdin);
freopen("arbint.out", "wt", stdout);
scanf("%d%d", &n, &m);
for(i=1; i<=n; ++i)
{
scanf("%d", &x);
value=x; position=i;
tree_update(1, 1, n);
}
for(i=1; i<=m; ++i)
{
scanf("%d%d%d", &type, &x, &y);
if(type)
{
position=x; value=y;
tree_update(1, 1, n);
}
else
{
maxx=-1;
start=x; finish=y;
tree_query(1, 1, n);
printf("%d\n", maxx);
}
}
return 0;
}