#include<iostream>
#include<stdio.h>
using namespace std;
const int NMAX = 1e5 + 5;
int n, m, arb[4 * NMAX], v[NMAX];
void update(int st, int dr, int idx, int val, int poz)
{
if(st == dr)
{
arb[idx] = val;
return;
}
int mij = (st + dr) / 2;
if(poz > mij)
update(mij + 1, dr, (idx * 2) + 1, val, poz);
else
update(st, mij, idx * 2, val, poz);
arb[idx] = max(arb[idx * 2], arb[(idx * 2) + 1]);
}
int query(int st, int dr, int arbst, int arbdr, int idx)
{
if(arbst > dr || arbdr < st)
return 0;
if(arbst >= st && arbdr <= dr)
return arb[idx];
int mij = (arbst + arbdr) / 2;
int valst = query(st, dr, arbst, mij, idx * 2);
int valdr = query(st, dr, mij + 1, arbdr, (idx * 2) + 1);
return max(valst, valdr);
}
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(1, n, 1, v[i], i);
}
for(int i = 1; i <= m; i++)
{
bool c;
int a, b;
cin >> c >> a >> b;
if(c == 0)
cout << query(a, b, 1, n, 1) << "\n";
else
update(1, n, 1, b, a);
}
}