#include <bits/stdc++.h>
using namespace std;
int v[100005], a[400006], n, cer, m, i, st,dr, x, y, q;
void build(int st, int dr, int nod)
{
if(st == dr)
v[nod] = a[st];
else
{
int mij = (st + dr) / 2;
build(st, mij, nod * 2);
build(mij + 1, dr, nod * 2 + 1);
v[nod] = max(v[nod * 2], v[nod * 2 + 1]);
}
}
void update(int nod, int st, int dr, int x, int y)
{
if(st == dr)
v[nod] = y;
else
{
int mij = (st + dr) / 2;
if(x <= mij)
update(2 * nod, st, mij, x, y);
else update(2 * nod + 1, mij + 1, dr, x, y);
v[nod] = max(v[nod * 2], v[nod * 2 + 1]);
}
}
int query(int nod, int st, int dr, int x, int y)
{
if(x <= st && y >= dr)
return v[nod];
else
{
int mij = (st + dr) / 2;
int ans1 = 0;
int ans2 = 0;
if(x <= mij)
ans1 = query(nod * 2, st, mij, x, y);
if(y > mij)
ans2 = query(nod * 2 + 1, mij + 1, dr, x, y);
return max(ans1, ans2);
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> n >> q;
for(int i = 1; i <= n; i ++)
f >> a[i];
build(1, n, 1);
for(int i = 1; i <= q; i ++)
{
f >> cer >> x >> y;
if(cer == 1)
update(1, 1, n, x, y);
else g << query(1, 1, n, x, y) << "\n";
}
return 0;
}