#include<fstream>
using namespace std;
const int N = 100003;
int n,m,o,i,Arb[4*N], A[N],a,b;
void Build(int nod, int left, int right)
{
if (left == right) Arb[nod] = A[left];
else {
int mij = (left+right)/2;
Build(2*nod,left, mij);
Build(2*nod+1,mij+1,right);
Arb[nod] = max(Arb[2*nod], Arb[2*nod+1]);
}
}
void update(int nod, int left , int right, int pos, int val)
{
if (left==right) Arb[nod]=val; else
{
int mij = (left + right)/2;
if (pos <= mij) update(2*nod, left, mij, pos, val);
else update(2*nod+1,mij+1,right,pos, val);
Arb[nod] = max(Arb[2*nod], Arb[2*nod+1]);
}
}
int Max(int nod, int left, int right, int a, int b)
{
if (left == a && b == right) return Arb[nod];
int mij= (left + right)/2;
if (b <= mij) return Max(2*nod,left, mij, a,b);
if (a > mij) return Max(2*nod+1,mij+1,right,a,b);
return max ( Max(2*nod,left,mij, a,mij), Max(2*nod+1,mij+1,right,mij+1,b) );
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin >> n >> m;
for (i=1;i<=n;i++)
cin>> A[i];
Build(1,1,n);
while (m--)
{
cin >> o >> a >> b;
if (o == 0) cout << Max(1,1,n,a,b) << '\n';
else update(1,1,n,a,b);
}
return 0;
}