#include<bits/stdc++.h>
using namespace std;
const int NMAX = 1e5 + 5;
int n, m, v[NMAX], arbint[4 * NMAX];
void update(int pos, int val, int arbst, int arbdr, int idx)
{
if(arbst == arbdr)
{
arbint[idx] = val;
return;
}
int mij = (arbst + arbdr) / 2;
if(pos > mij)
update(pos, val, mij + 1, arbdr, idx * 2 + 1);
else
update(pos, val, arbst, mij, idx * 2);
arbint[idx] = max(arbint[idx * 2], arbint[idx * 2 + 1]);
}
int query(int arbst, int arbdr, int st, int dr, int idx)
{
if(arbst > dr || arbdr < st)
return 0;
if(arbst >= st && arbdr <= dr)
return arbint[idx];
int mij = (arbst + arbdr) / 2;
return max(query(arbst, mij, st, dr, idx * 2), query(mij + 1, arbdr, st, dr, idx * 2 + 1));
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
cin >> v[i];
update(i, v[i], 1, n, 1);
}
int c, a, b;
for(int i = 1; i <= m; i++)
{
cin >> c >> a >> b;
if(c == 1)
{
update(a, b, 1, n, 1);
v[a] = b;
}
else
{
cout << query(1, n, a, b, 1) << "\n";
}
}
}