#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
int a[4 * NMAX], v[NMAX], n, i, m, t, x, y;
void build(int st, int dr, int nod)
{
if(st == dr) a[nod] = v[st];
else
{
int mij = (st + dr) / 2;
build(st, mij, nod * 2);
build(mij + 1, dr, nod * 2 + 1);
a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
}
}
int querry(int st, int dr, int nod, int l, int r)
{
if(l > r) return INT_MIN;
if(l == st && r == dr) return a[nod];
int mij = (st + dr) / 2;
return max(querry(st, mij, nod * 2, l, min(r, mij)), querry(mij + 1, dr, nod * 2 + 1, max(l, mij + 1), r));
}
void update(int st, int dr, int nod, int poz, int val)
{
if(st == dr && poz == dr) a[nod] = val;
else if(poz >= st && poz <= dr)
{
int mij = (st + dr) / 2;
update(st, mij, nod * 2, poz, val);
update(mij + 1, dr, nod * 2 + 1, poz, val);
a[nod] = max(a[nod * 2], a[nod * 2 + 1]);
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f >> n >> m;
for(i = 1; i <= n; i++)
f >> v[i];
build(1, n, 1);
for(i = 1; i <= m; i++)
{
f >> t;
if(t == 0)
{
f >> x >> y;
g << querry(1, n, 1, x, y) << "\n";
}
if(t == 1)
{
f >> x >> y;
update(1, n, 1, x, y);
}
}
return 0;
}