#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n, m;
int numere[100000];
int operatie, a, b;
class ArboreDeIntervale{
public:
int arbore[400000];
int solutie;
void construire(int st, int dr, int k)
{
if(st == dr)
{
arbore[k] = numere[st];
}
else
{
int mij = (st + dr) / 2;
construire(st, mij, k * 2);
construire(mij + 1, dr, k * 2 + 1);
arbore[k] = max(arbore[k * 2], arbore[k * 2 + 1]);
}
}
void maximInterval(int st, int dr, int stx, int drx, int k)
{
if(st >= stx && dr <= drx)
{
solutie = max(solutie, arbore[k]);
}
else
{
int mij = (st + dr) / 2;
if(stx <= mij)
{
maximInterval(st, mij, stx, drx, k * 2);
}
if(drx > mij)
{
maximInterval(mij + 1, dr, stx, drx, k * 2 + 1);
}
}
}
void inlocuire(int st, int dr, int pos, int valoare, int k)
{
if(st == dr)
{
arbore[k] = valoare;
}
else
{
int mij = (st + dr) / 2;
if(pos <= mij)
{
inlocuire(st, mij, pos, valoare, k * 2);
}
else
{
inlocuire(mij + 1, dr, pos, valoare, k * 2 + 1);
}
arbore[k] = max(arbore[k * 2], arbore[k * 2 + 1]);
}
}
};
void citire()
{
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%d", &numere[i]);
}
}
void citireLinie()
{
scanf("%d %d %d", &operatie, &a, &b);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
citire();
ArboreDeIntervale arb;
arb.construire(0, n - 1, 1);
for(int i = 0; i < m; i++)
{
citireLinie();
if(operatie == 0)
{
arb.solutie = 0;
arb.maximInterval(0, n - 1, a - 1, b - 1, 1);
printf("%d\n", arb.solutie);
}
else if(operatie == 1)
{
arb.inlocuire(0, n - 1, a - 1, b, 1);
}
}
return 0;
}