#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
#define cin fin
#define cout fout
#define DIM 400005
int arbint[DIM];
int N, M, nr, a, b, x, y, tip;
void update(int poz, int val, int nod, int in, int sf)
{
if(in == sf)
{
if(in == poz)
arbint[nod] = val;
return ;
}
int mij = (in + sf) / 2;
if(in <= poz && poz <= mij)
update(poz, val, 2 * nod, in, (in + sf) / 2);
if(mij < poz && poz <= sf)
update(poz, val, 2 * nod + 1, (in + sf) / 2 + 1, sf);
arbint[nod] = max(arbint[nod * 2], arbint[nod * 2 + 1]);
}
int query(int st, int dr, int nod, int in, int sf)
{
if(st <= in && sf <= dr)
return arbint[nod];
int mij = (in + sf) / 2;
if(mij < st)
return query(st, dr, 2 * nod + 1, mij + 1, sf);
if(mij >= dr)
return query(st, dr, 2 * nod, in, mij);
return max(query(st, dr, 2 * nod, in, mij), query(st, dr, 2 * nod + 1, mij + 1, sf));
}
int main() {
cin>>N>>M;
for(int i = 1; i <= N; ++i)
{
cin>>nr;
update(i, nr, 1, 1, N);
}
for(int i = 1; i <= M; ++i)
{
cin>>tip;
if(tip == 0)
{
cin>>x>>y;
cout << query(x, y, 1, 1, N) << '\n';
}
else
{
cin>>a>>b;
update(a, b, 1, 1, N);
}
}
return 0;
}