#include <cstdio>
#include <algorithm>
using namespace std;
int numere[100000];
class ArboreDeIntervale
{
public:
int arbore[400000];
int sol;
arboreDeIntervale()
{
sol = 0;
}
int getSol()
{
return sol;
}
void setSol(int x)
{
sol = x;
}
void construire(int k, int st, int dr)
{
if(st == dr)
{
arbore[k] = numere[st];
}
else
{
int mij = (st + dr) / 2;
construire(2 * k, st, mij);
construire(2 * k + 1, mij + 1, dr);
arbore[k] = max(arbore[2 * k], arbore[2 * k + 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, 2 * k);
}
else
{
inlocuire(mij + 1, dr, pos, valoare, 2 * k + 1);
}
arbore[k] = max(arbore[k * 2], arbore[k * 2 + 1]);
}
}
void maximInterval(int st, int dr, int stx, int drx, int k)
{
if(stx >= st && drx <= dr)
{
sol = max(sol, arbore[k]);
}
else
{
int mij = (stx + drx) / 2;
if(st <= mij)
{
maximInterval(st, dr, stx, mij, k * 2);
}
if(dr > mij)
{
maximInterval(st, dr, mij + 1, drx, k * 2 + 1);
}
}
}
};
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
ArboreDeIntervale arb;
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%d", &numere[i]);
}
arb.construire(1, 0, n - 1);
for(int i = 0; i < m; i++)
{
int tmp1, tmp2, tmp3;
scanf("%d %d %d", &tmp1, &tmp2, &tmp3);
if(tmp1 == 0)
{
arb.setSol(0);
arb.maximInterval(tmp2 - 1, tmp3 - 1, 0, n - 1, 1);
printf("%d\n", arb.getSol());
}
else
{
arb.inlocuire(0, n - 1, tmp2 - 1, tmp3, 1);
}
}
return 0;
}