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