#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m,v[100001],arbore[100001];
void build(int nod,int st,int dr)
{
if(st == dr)
arbore[nod] = v[st];
else
{
int mid = (st+dr)/2;
build(nod*2,st,mid);
build(nod*2+1,mid+1,dr);
arbore[nod] = max(arbore[nod*2], arbore[nod*2+1]);
}
}
void update(int nod, int st, int dr, int a, int b)
{
if(st == dr)
arbore[nod] = b;
else
{
int mid = (st+dr)/2;
if(a <= mid)
update(nod*2, st, mid, a,b);
else
update(nod*2+1, mid+1, dr, a,b);
arbore[nod] = max(arbore[nod*2], arbore[nod*2+1]);
}
}
int solve(int nod,int st,int dr,int a,int b)
{
if(st >= a && dr <= b)
return arbore[nod];
int mid = (st+dr)/2;
if(b <= mid)
return solve(nod*2, st, mid, a,b);
if(a > mid)
return solve(nod*2+1, mid+1, dr, a,b);
int x = solve(nod*2, st, mid, a,b);
int y = solve(nod*2+1, mid+1, dr, a,b);
return max(x,y);
}
int main()
{
in>>n>>m;
for(int i = 1;i<=n;i++)
in>>v[i];
build(1,1,n);
for(int i = 1;i<=m;i++)
{
int t,a,b;
in>>t>>a>>b;
if(t == 0)
out<<solve(1,1,n,a,b)<<"\n";
else
update(1,1,n,a,b);
}
return 0;
}