#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,aint[400002];
int querysolver(int st, int dr, int nod, int left, int right)
{int mij;
if (st==left && dr==right) return aint[nod];
else {mij=(st+dr)/2;
if (right<=mij) return querysolver(st,mij,2*nod,left,right);
else if (left>mij) return querysolver(mij+1,dr,2*nod+1,left,right);
else return max(querysolver(st,mij,2*nod,left,mij),querysolver(mij+1,dr,2*nod+1,mij+1,right));
}
}
int query(int st, int dr)
{
return querysolver(1,n,1,st,dr);
}
void updater(int st, int dr, int nod, int poz, int val)
{int mij;
if (st==dr) aint[nod]=val;
else {mij=(st+dr)/2;
if (poz<=mij) updater(st,mij,2*nod,poz,val);
else updater(mij+1,dr,2*nod+1,poz,val);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
void update(int poz, int val)
{
return updater(1,n,1,poz,val);
}
int main()
{f>>n>>m;
int x,y,p;
for (int i=1;i<=n;i++) {f>>x;
update(i,x);
}
for (int i=1;i<=n;i++) {f>>p>>x>>y;
if (p==0) g<<query(x,y)<<'\n';
else update(x,y);
}
}