#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct IntervalTree {
vector<int> v;
explicit IntervalTree(int n) : v(4*n, -1) {}
void update(int pos, int node, int left, int right, int val) {
if(left==right)
{
v[node]=val;
return;
}
int mij=(left+right)/2;
if(pos<=mij)
update(pos, 2*node, left, mij, val);
else
update(pos, 2*node+1, mij+1, right, val);
v[node]=max(v[2*node], v[2*node+1]);
}
int query(int qleft, int qright, int node, int left, int right) {
if(qleft>qright)
return -1;
if(left==right)
return v[node];
if(qleft<=left && qright>=right)
return v[node];
int mij=(left+right)/2;
if(qright<=mij)
return query(qleft, qright, 2*node, left, mij);
else if(qleft>mij)
return query(qleft, qright, 2*node+1, mij+1, right);
else
return max(query(qleft, mij, 2*node, left, mij), query(mij+1, qright, 2*node+1, mij+1, right));
}
};
ostream& operator<<(ostream& out, IntervalTree arb) {
for(int i=1;i<arb.v.size();i++)
if(arb.v[i]!=-1)
out<<i<<": "<<arb.v[i]<<'\n';
return out;
}
int main() {
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
in>>n>>m;
IntervalTree arb(n);
for(int i=1;i<=n;i++)
{
int x;
in>>x;
arb.update(i, 1, 1, n, x);
}
out<<arb;
while(m)
{
int c, a, b;
in>>c>>a>>b;
if(c==0)
{
//out<<arb;
out<<arb.query(a, b, 1, 1, n)<<"\n\n\n";
}
else
arb.update(a, 1, 1, n, b);
m--;
}
return 0;
}