#include <iostream>
#include <fstream>
#define Nmax 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, q, a, b;
int v[Nmax], ai[4*Nmax];
int ansQ;
void build(int poz, int st, int dr)
{
int mj=(st+dr)/2, fs=(poz << 1);
if(st == dr)
{
ai[poz]=v[st];
return;
}
build(fs, st, mj);
build(fs+1, mj+1, dr);
ai[poz]=max(ai[fs], ai[fs+1]);
}
void update(int poz, int st, int dr, int x, int pozUpd)
{
int mj=(st+dr)/2, fs=(poz << 1);
if (st == dr)
{
ai[poz] = x;
return;
}
if(pozUpd <= mj)
update(fs, st, mj, x, pozUpd);
else
update(fs+1, mj+1, dr, x, pozUpd);
ai[poz]=max(ai[fs], ai[fs+1]);
}
void query(int poz, int st, int dr, int qst, int qdr)
{
int mj=(st+dr)/2, fs=(poz << 1);
if(st > qdr || dr < qst) return;
if(qst <= st && qdr >= dr)
{
ansQ=max(ansQ, ai[poz]);
return;
}
if(qst <= mj)
query(fs, st, mj, qst, qdr);
if(qdr > mj)
query(fs+1, mj+1, dr, qst, qdr);
}
int main()
{
f >> n >> m;
for (int i = 1; i <= n; i++) f >> v[i];
build(1, 1, n);
while(m--)
{
f >> q >> a >> b;
if(q == 0)
{
ansQ=-1;
query(1, 1, n, a, b);
g << ansQ << '\n';
}
else update(1, 1, n, b, a);
}
return 0;
}