#include <bits/stdc++.h>
#define Ls(x) (x * 2)
#define Rs(x) (x * 2 + 1)
#define Nmax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[Nmax * 4];
int v[Nmax];
int answer;
int n, m;
void Build(int left, int right, int node)
{
if(right == left)
{
aint[node] = v[left];
return;
}
int m = (left + right) / 2;
Build(left, m, Ls(node));
Build(m + 1, right, Rs(node));
aint[node] = max(aint[Ls(node)], aint[Rs(node)]);
}
void Update(const int &pos, const int &x, int left, int right, int node)
{
if(left == right)
{
aint[node] = x;
return;
}
int m = (left + right) / 2;
if(pos <= m)
Update(pos, x, left, m, Ls(node));
else
Update(pos, x, m + 1, right, Rs(node));
aint[node] = max(aint[Ls(node)], aint[Rs(node)]);
}
void Query(const int &Qleft, const int &Qright, int left,int right,int node)
{
if(Qleft <= left && right <= Qright)
{
answer = max(answer,aint[node]);
return;
}
int m = (left + right) / 2;
if(Qleft <= m)
Query(Qleft, Qright, left, m, Ls(node));
if(Qright >= m + 1)
Query(Qleft, Qright, m + 1, right, Rs(node));
}
int main()
{
int c, x, y;
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> v[i];
Build(1,n,1);
for(int i = 1; i <= m; i++)
{
fin >> c >> x >> y;
if(c == 0)
{
answer = -1;
Query(x, y, 1, n, 1);
fout << answer << "\n";
}
else
Update(x,y,1,n,1);
}
return 0;
}