#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
int tree[200020], numere[100001];
int N,M;
void create_tree(int nod, int st, int dr);
void update(int nod, int st, int dr, int a, int b, int val);
int interogare(int nod, int st, int dr, int a, int b);
void init();
int maxim(int a, int b)
{
return (a)>(b)?(a):(b);
}
int main()
{
init();
for(int i=1;i<=M;i++)
{
int p, a, b;
fi>>p>>a>>b;
if(p==1)
update(1,1,N,a,a,b);
else if(p==0)
fo<<interogare(1,1,N,a,b)<<"\n";
}
return 0;
}
void init()
{
fi>>N>>M;
for(int i=1;i<=N;i++)
fi>>numere[i];
create_tree(1,1,N);
return;
}
void create_tree(int nod, int st, int dr)
{
if(st==dr)
{
tree[nod] = numere[st];
return;
}
int m = (st+dr)/2;
create_tree(2*nod,st,m);
create_tree(2*nod+1,m+1,dr);
tree[nod] = maxim(tree[2*nod], tree[2*nod+1]);
return;
}
int interogare(int nod, int st, int dr, int a, int b)
{
if(a<=st && b>=dr)
return tree[nod];
else
{
int m = (st+dr)/2;
int x=0,y=0;
if(a<=m)
x = interogare(2*nod,st,m,a,b);
if(b>m)
y = interogare(2*nod+1,m+1,dr,a,b);
return maxim(x,y);
}
}
void update(int nod, int st, int dr, int a, int b, int val)
{
if(a<=st && b>=dr)
{
tree[nod] = val;
return;
}
else
{
int m = (st+dr)/2;
if(a<=m)
update(2*nod,st,m,a,b,val);
if(b>m)
update(2*nod+1, m+1,dr,a,b,val);
tree[nod] = maxim(tree[2*nod],tree[2*nod+1]);
return;
}
return;
}