#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAXN = 1e5 + 10;
int aint[2 * MAXN + 2];
int v[MAXN];
int n, m;
void makeAINT(int nod, int left, int right) {
if(left == right)
aint[nod] = v[left];
else {
int med = (left + right) >> 1;
int L = nod + 1;
int R = nod + 2 * ( med - left + 1 );
makeAINT(L, left, med);
makeAINT(R, med + 1, right);
aint[nod] = max(aint[L], aint[R]);
}
}
int queryAINT(int nod, int left, int right, const int& l, const int& r) {
if(l <= left && right <= r)
return aint[nod];
else {
int med = (left + right) >> 1;
int L = nod + 1;
int R = nod + 2 * ( med - left + 1 );
int ans = 0;
if(l <= med)
ans = queryAINT(L, left, med, l, r);
if(med < r)
ans = max(ans, queryAINT(R, med + 1, right, l, r));
return ans;
}
}
void updateAINT(int nod, int left, int right, const int& poz, const int& val) {
if(left == right)
aint[nod] = val;
else {
int med = (left + right) >> 1;
int L = nod + 1;
int R = nod + 2 * ( med - left + 1 );
if(poz <= med)
updateAINT(L, left, med, poz, val);
else updateAINT(R, med + 1, right, poz, val);
aint[nod] = max(aint[L], aint[R]);
}
}
int main()
{
fin >> n >> m;
for(int i = 0; i < n; i++)
fin >> v[i];
makeAINT(0, 0, n - 1);
int type, a, b;
while(m--) {
fin >> type >> a >> b;
if(!type)
fout << queryAINT(0, 0, n - 1, a - 1, b - 1) << '\n';
else updateAINT(0, 0, n - 1, a - 1, b);
}
return 0;
}