#include <cstdio>
#include <algorithm>
#define nmax 500050
using namespace std;
int n, m, i, x, a, b;
int ai[nmax];
int start, finish, pos, maxx, value;
void tree_update(int node, int left, int right)
{
if(left==right)
{
ai[node]=value;
return;
}
int mid=(left+right)/2;
if(pos<=mid) tree_update(2*node, left, mid);
else tree_update(2*node+1, mid+1, right);
ai[node]=max(ai[2*node], ai[2*node+1]);
}
void tree_query(int node, int left, int right)
{
if(start<=left && right<=finish)
{
if(maxx<ai[node]) maxx=ai[node];
return;
}
int mid=(left+right)/2;
if(start<=mid) tree_query(2*node, left, mid);
if(mid<=start) 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);
pos=i; value=x;
tree_update(1, 1, n);
}
for(i=1; i<=m; ++i)
{
scanf("%d%d%d", &x, &a, &b);
if(x)
{
pos=a; value=b;
tree_update(1, 1, n);
}
else
{
maxx=-1;
start=a; finish=b;
tree_query(1, 1, n);
printf("%d\n", maxx);
}
}
return 0;
}