#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[400001],str,fnl,poz,val,maxim=INT_MIN;
void update(int nod, int st, int dr, int val ,int poz)
{
if(st == dr)
{
arb[nod] = val;
return;
}
int mij = (dr + st) / 2;
if(mij >= poz)
{
update(2*nod, st, mij, val, poz);
}
else
{
update(2*nod+1, mij+1, dr, val, poz);
}
arb[nod] = max(arb[2*nod], arb[2*nod + 1]);
}
int query(int nod, int str, int fnl, int st, int dr)
{
if((st >= str) && (dr <= fnl))
{
maxim = max(arb[nod], maxim);
return 0;
}
int mij = (dr + st) / 2;
if(mij >= str) query(2*nod, str, fnl, st, mij);
if(mij < fnl) query(2*nod+1, str, fnl, mij+1, dr);
}
int main()
{
int n,m,op,x,y;
fin >> n >> m;
for(int i=1; i<=n; i++)
{
fin >> val;
update(1,1,n,val,i);
}
for(int i=1; i<=m; i++)
{
fin >> op >> x >> y;
if(op == 0)
{
maxim= -1;
query(1,x,y,1,n);
fout<<maxim << '\n';
}
else
{
update(1,1,n,y,x);
}
}
return 0;
}