#include <iostream>
#include <cstdio>
#include <stdio.h>
using namespace std;
int v[100001], arb[400001];
void update(int poz, int val, int st, int dr, int nod)
{
if(st == dr)
{
arb[nod] = val;
return;
}
int mid = (st + dr) / 2;
if(mid >= poz)
update(poz, val, st, mid, nod * 2);
if(mid < poz)
update(poz, val, mid + 1, dr, nod * 2 + 1);
if(arb[nod * 2] > arb[nod * 2 + 1])
arb[nod] = arb[nod * 2];
else arb[nod] = arb[nod * 2 + 1];
}
int getmax(int a, int b, int st, int dr, int nod)
{
if(a <= st && b >= dr)
return arb[nod];
int mid = (st + dr) / 2, v1 = 0, v2 = 0;
if(a <= mid)
v1 = getmax(a, b, st, mid, nod * 2);
if(b > mid)
v2 = getmax(a, b, mid + 1, dr, nod * 2 + 1);
return v1 > v2 ? v1 : v2;
return v2;
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, i, j, m, t, a, b;
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i++)
{
scanf("%d", &j);
update(i, j, 1, n, 1);
}
for(i = 0; i < m; i++)
{
scanf("%d%d%d", &t, &a, &b);
if(t == 0)
{
printf("%d\n", getmax(a, b, 1, n, 1));
}
else
{
update(a, b, 1, n, 1);
}
}
return 0;
}