#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int x, op, a, b, Max, n, m;
int aint[400001];
void update(int node, int st, int dr, int val, int pos)
{
if(st==dr)
{
aint[node]=val;
return;
}
int mij=(st+dr)/2;
if(pos<=mij) update(2*node, st, mij, val, pos);
else update(2*node+1, mij+1, dr, val, pos);
aint[node]=max(aint[2*node], aint[2*node+1]);
}
void query(int node, int st, int dr, int qs, int qd)
{
if(qs<=st && dr<=qd)
{
if(aint[node]>Max) Max=aint[node];
return ;
}
int mij=(st+dr)/2;
if(qs<=mij) query(2*node, st, mij, qs, qd);
if(mij<qd) query(2*node+1, mij+1, dr, qs, qd);
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; ++i)
{
fin>>x;
update(1, 1, n, x, i);
}
for(int q=1; q<=m; ++q)
{
fin>>op>>a>>b;
if(op==0)
{
Max=-1;
query(1, 1, n, a, b);
fout<<Max<<"\n";
}
else update(1, 1, n, b, a);
}
return 0;
}