#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100002;
int n, m, ans;
int aint[4 * NMAX];
int a[NMAX];
int Leftson(int node)
{
return 2 * node;
}
int Rightson(int node)
{
return 2 * node + 1;
}
void Build(int nod, int left, int right)
{
if(left == right)
{
aint[nod] = a[left];
return;
}
int mid = (left + right) / 2;
Build(Leftson(nod), left, mid);
Build(Rightson(nod), mid + 1, right);
aint[nod] = max(aint[Leftson(nod)], aint[Rightson(nod)]);
}
void Update(int nod, int left, int right, int poz, int val)
{
if(left == right)
{
a[poz] = val;
aint[nod] = val;
return;
}
int mid = (left + right) / 2;
if(poz <= mid)
Update(Leftson(nod), left, mid, poz, val);
else
Update(Rightson(nod), mid + 1, right, poz, val);
aint[nod] = max(aint[Leftson(nod)], aint[Rightson(nod)]);
}
void Query(int nod, int left, int right, int lquery, int rquery)
{
if(lquery <= left && rquery >= right)
{
ans = max(ans, aint[nod]);
return;
}
int mid = (left + right) / 2;
if(lquery <= mid)
Query(Leftson(nod), left , mid, lquery, rquery);
if(rquery > mid)
Query(Rightson(nod), mid + 1, right, lquery, rquery);
}
void Citire()
{
int i, op, x, y;
fin >> n >> m;
for(i = 1;i <= n;i++)
fin >> a[i];
Build(1, 1, n);
while(m--)
{
fin >> op >> x >> y;
if(op == 1)
Update(1, 1, n, x, y);
else
{
ans = -1;
Query(1, 1, n, x, y);
fout << ans << "\n";
}
}
}
int main()
{
Citire();
return 0;
}