# include <bits/stdc++.h>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
const int nmax = 1e5 + 5;
int s[nmax<<2];
int v[nmax];
void built(int p,int u,int nod)
{
if (p > u) return;
if (p == u) s[nod] = v[p];
else
{
int m = (p + u)>>1;
built(p,m,nod<<1);
built(m+1,u,(nod<<1)+1);
s[nod] = max(s[nod<<1],s[(nod<<1)+1]);
}
}
int query(int p,int u,int st,int dr,int nod)
{
if (p > u) return -1;
if (st <= p && u <= dr) return s[nod];
else
{
int m = (p + u)>>1;
int cnt = -1;
if (st <= m) cnt = max(cnt,query(p,m,st,dr,nod<<1));
if (m < dr) cnt = max(cnt,query(m+1,u,st,dr,(nod<<1)+1));
return cnt;
}
}
void update(int p,int u,int pos,int val,int nod)
{
if (p > u) return;
if (p == u) s[nod] = val;else
{
int m = (p + u)>>1;
if (pos <= m) update(p,m,pos,val,nod<<1);
else update(m+1,u,pos,val,(nod<<1)+1);
s[nod] = max(s[nod<<1],s[(nod<<1)+1]);
}
}
int main(void)
{
int n,m,ok,x,y;
fi>>n>>m;
for (int i=1;i<=n;++i) fi>>v[i];
built(1,n,1);
while (m --)
{
fi>>ok>>x>>y;
if (!ok) fo << query(1,n,x,y,1) << '\n';else update(1,n,x,y,1);
}
return 0;
}