#include <bits/stdc++.h>
using namespace std;
int Arbore[400005], V[100005];
int x,y,n,m;
bool op;
void fast ()
{
ios_base::sync_with_stdio(false);
cin.tie();
}
void update (int pozitie, int valoare, int nodcurent=1, int capatST=1, int capatDR=n)
{
if (capatST==capatDR)
{
Arbore[nodcurent]=valoare;
return;
}
int mid = (capatST+capatDR)/2;
if (pozitie <= mid)
{
update (pozitie, valoare, nodcurent *2, capatST, mid);
}
else
{
update (pozitie, valoare, nodcurent *2+1, mid+1, capatDR);
}
Arbore[nodcurent]= max (Arbore[nodcurent *2],Arbore[nodcurent *2+1]);
}
int query (int queryST, int queryDR, int nodcurent=1, int capatST=1, int capatDR=n)
{
if (queryST==capatST && queryDR==capatDR)
{
return Arbore[nodcurent];
}
int mid = (capatST+capatDR)/2;
if (queryDR<=mid)
{
return query (queryST, queryDR, nodcurent *2, capatST, mid);
}
else if (mid+1<=queryST)
{
return query (queryST, queryDR, nodcurent *2+1, mid+1, capatDR);
}
else
{
int a= query (queryST, mid, nodcurent *2, capatST, mid);
int b= query (mid+1, queryDR, nodcurent *2+1, mid+1, capatDR);
return max (a,b);
}
}
int main()
{
fast();
freopen("arbint.in","r", stdin);
freopen("arbint.out","w", stdout);
cin >> n >> m;
for (int i=1; i<=n; i++)
{
cin >> V[i];
update (i,V[i]);
}
for (int i=1; i<=m; i++)
{
cin >> op >> x >> y;
if (op==1)
update (x,y);
if (op==0)
cout << query (x,y) << '\n';
}
return 0;
}