#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX(100005);
struct AINT{
int vec[4 * NMAX + 5];
AINT(){
memset(vec, 0, sizeof(vec));
}
void Update(int nod, int st, int dr, int val, int poz){
if(st == dr){
vec[nod] = val;
return;
}
int mij = (st + dr) / 2;
if(poz <= mij)
Update(2 * nod, st, mij, val, poz);
else Update(2 * nod + 1, mij + 1, dr, val, poz);
vec[nod] = max(vec[2 * nod], vec[2 * nod + 1]);
}
int Query(int nod, int st, int dr, int a, int b){
if(a <= st && dr <= b)
return vec[nod];
int mij = (st + dr) / 2, val1 = 0, val2 = 0;
if(a <= mij)
val1 = Query(2 * nod, st, mij, a, b);
if(b > mij)
val2 = Query(2 * nod + 1, mij + 1, dr, a, b);
return max(val1, val2);
}
};
int main()
{
int n, m;
fin >> n >> m;
AINT Arb;
for(int i = 1; i <= n; ++i){
int x;
fin >> x;
Arb.Update(1, 1, n, x, i);
}
for(int i = 1; i <= m; ++i){
int tip, a, b;
fin >> tip >> a >> b;
if(tip == 0)
fout << Arb.Query(1, 1, n, a, b) << '\n';
else Arb.Update(1, 1, n, b, a);
}
return 0;
}