#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define VMAX 100005
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
struct nod
{
int val;
int flag;
};
nod da_tree[VMAX*4];
int maxi;
void build(int nr, int st, int dr)
{
int mij = (st+dr)/2;
if(st == dr)
{
fin>>da_tree[nr].val;
da_tree[nr].flag = 0;
}
else
{
build(nr*2,st, mij);
build(nr*2+1,mij+1, dr);
da_tree[nr].val = max(da_tree[nr*2].val,da_tree[2*nr+1].val);
da_tree[nr].flag = 0;
}
}
void querry(int nr, int st, int dr, int a, int b)
{
if(a<=st && dr<=b)
{
maxi = max(maxi,da_tree[nr].val);
}
else
{
if(da_tree[nr].flag)
{
da_tree[2*nr]=da_tree[2*nr+1]=da_tree[nr];
da_tree[nr].flag = 0;
}
int mij = (st+dr)/2;
if(mij>=a)
querry(nr*2, st, mij, a, b);
if(mij+1<=b)
querry(2*nr+1, mij+1, dr, a, b);
}
}
void update(int val, int nr, int st, int dr, int a, int b)
{
if(a<=st && dr<=b)
{
da_tree[nr].val=val;
da_tree[nr].flag = 1;
}
else
{
int mij = (st+dr)/2;
if(mij>=a)
update(val, nr*2, st, mij, a, b);
if(mij+1<=b)
update(val, nr*2+1, mij+1, dr, a, b);
da_tree[nr].val = max(da_tree[nr*2].val,da_tree[nr*2+1].val);
}
}
int main()
{
ios_base::sync_with_stdio(0);
long long int n,m,i,j,k,t,q,nr,minim,maxim,suma,x,y,z;
fin>>n>>m;
build(1,1,n);
for(i=0;i<m;i++)
{
fin>>x>>y>>z;
if(x==0)
{
maxi = 0;
querry(1,1,n,y,z);
fout<<maxi<<'\n';
}
else
{
update(z,1,1,n,y,y);
}
}
return 0;
}