#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int N = 100005;
int n,m,maxim;
vector<int>a;
int arbint[N * 2];
void modific(int p, int a, int b, int poz, int val)
{
/*
p -> pozitia curenta din vectorul arbint
a,b sunt capetele intervalului curent/de start in situatia ta 1,n
poz -> pozitia din intervalul a,b pe care vrei sa o modifici
val -> valoarea pe care vrei sa o pui
*/
if (b == a)
{
arbint[p] = val;
return;
}
int mid = (a + b ) / 2;
if (poz <= mid)
modific(2 * p,a,mid,poz,val);
else
modific(2 * p + 1,mid + 1,b,poz,val);
//cout << p << " " << arbint[2 * p] << " " << arbint[2 * p + 1] << '\n';
arbint[p] = max(arbint[2 * p + 1],arbint[2 * p]);
}
void interogare(int p, int a, int b, int st, int dr)
{
/*
p -> pozitia curenta din vectorul arbint
a,b sunt capetele intervalului curent/de start in situatia ta 1,n
st,dr sunt capetele intervalului curent/de start pe care vrem sa aflam maximul
*/
if (a >= st and b <= dr)
{
if (arbint[p] > maxim)
maxim = arbint[p];
return;
}
int mid = (a + b ) / 2;
if (st <= mid)
return interogare(2 * p,a,mid,st,dr);
if (dr > mid)
return interogare(2 * p + 1,mid + 1,b,st,dr);
}
int main()
{
int i,t,x,y;
in >> n >> m;
for (i = 1; i <= n; i++)
{
in >> x;
a.push_back(x);
modific(1,1,n,i,x);
}
//for (i = 1; i < 2 * n; i++)
// cout << arbint[i] << " ";
for (i = 1; i <= m; i++)
{
in >> t >> x >> y;
if (t == 1)
modific(1,1,n,x,y);
else
{
maxim = -1;
interogare(1,1,n,x,y);
out << maxim << '\n';
}
}
return 0;
}