#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[300000],N,M,a[100005];
int Query(int nod, int x, int y, int st, int dr)
{
int m;
if(x == st && y == dr) return aint[nod];
m = (st+dr)>>1;
if(y <= m) return Query(nod*2,x,y,st,m);
if(m+1 <= x) return Query(nod*2+1,x,y,m+1,dr);
return max(Query(nod*2,x,m,st,m),Query(nod*2+1,m+1,y,m+1,dr));
}
void Update(int p, int x)
{
int t;
aint[p] = x;
while(p > 0)
{
t = p/2;
aint[t] = max(aint[t*2],aint[t*2+1]);
p = t;
}
}
int main()
{
int i,k,op,x,y;
fin>>N>>M;
for(i = 1; i <= N; i++) fin>>a[i];
k = 1;
while(k < N) k*=2;
for(i = k; i < k+N; i++)
aint[i] = a[i-k+1];
for(i = k-1; i > 0; i--)
aint[i] = max(aint[i*2],aint[i*2+1]);
N = k;
for(i = 1; i <= M; i++)
{
fin>>op>>x>>y;
if(op == 0) fout << Query(1,x,y,1,N) << "\n";
else Update(x+N-1,y);
}
return 0;
}