#include <iostream>
#include <cstdio>
using namespace std;
int n, q, i, op, a, b, poz, val, sol, v[100001], seg[4 * 100001];
void build(int node, int l, int r)
{
if(l==r)
{
seg[node] = v[r];
return;
}
int m = (l + r)/2;
build(2*node, l, m);
build(2*node + 1, m + 1, r);
seg[node] = max(seg[2*node], seg[2*node + 1]);
}
void update(int node, int l, int r, int poz, int val)
{
if(l == r)
{
seg[node] = val;
return;
}
int m = (l + r)/2;
if(poz <= m) update(2*node, l, m, poz, val);
else update(2*node + 1, m + 1, r, poz, val);
seg[node] = max(seg[2*node], seg[2*node + 1]);
}
void query(int node, int l, int r, int a, int b)
{
if(a<=l && r<=b)
{sol = max(sol, seg[node]);return;}
int m = (l + r)/2;
if(a<=m) query(2*node, l, m, a, b);
if(b>m) query(2*node+1, m+1, r, a, b);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i++)
scanf("%d", &v[i]);
build(1, 1, n);
while(m)
{
scanf("%d", &op);
if(op == 1)
{
scanf("%d%d", poz, val);
update(1, 1, n, poz, val);
}
else
{
scanf("%d%d", &a, &b);
sol = 0;
query(1, 1, n, a, b);
printf("%d\n", sol);
}
m--;
}
return 0;
}