#include <fstream>
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
#include <stack>
#include <iomanip>
#include <cstring>
#include <cmath>
#define NMax 400005
#define INF 0x3f3f3f3f
using namespace std;
int TR[NMax],sol;
int n,m,x,y,p;
void update(int nod,int st,int dr, int a,int b,int val){
if(a <= st && dr <= b){
TR[nod] = val;
}else{
int mij = (st + dr) / 2;
if(a <= mij)
update(2*nod,st,mij,a,b,val);
if(mij < b)
update(2*nod + 1,mij+1,dr,a,b,val);
TR[nod] = max(TR[2*nod],TR[2*nod + 1]);
}
}
void inter(int nod,int st,int dr, int a,int b){
if(a <= st && dr <= b){
sol = max(TR[nod],sol);
}else{
int mij = (st + dr) / 2;
if(a <= mij)
inter(2*nod,st,mij,a,b);
if(mij < b)
inter(2*nod + 1,mij+1,dr,a,b);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; ++i){
scanf("%d",&x);
update(1,1,n,i,i,x);
}
for(int i = 1; i <= m; ++i){
scanf("%d%d%d",&p,&x,&y);
if(p == 0){
sol = -INF;
inter(1,1,n,x,y);
printf("%d\n",sol);
}else{
update(1,1,n,x,x,y);
}
}
return 0;
}