#include <cstdio>
#define MAXN 100005
using namespace std;
inline int max(int a, int b)
{
return (a>b) ? (a) : (b);
}
class Input
{
char *b;
int bs,bi;
inline bool isdigit(char c)
{
return c>='0' && c<='9';
}
public:
Input(const char *s)
{
FILE *f = fopen(s,"r");
fseek(f,0,SEEK_END);
bs = ftell(f);
fseek(f,0,SEEK_SET);
b = new char[bs+1];
fread(b,1,bs,f);
bi = 0;
}
Input& operator>>(int &x)
{
x = 0;
while(!isdigit(b[bi]))
++bi;
while(isdigit(b[bi]) && bi<bs)
{
x = x * 10 + b[bi] - '0';
++bi;
}
return *this;
}
};
int n, m, a[MAXN];
int tree[MAXN*4];
int pos, val, inc, sf;
void update(int st,int dr,int pai)
{
if(st==dr)
{
tree[pai] = val;
}
else
{
int mid = (st + dr) >> 1;
if(pos <= mid)
{
update(st,mid,pai<<1);
}
else
{
update(mid+1,dr, (pai<<1) + 1);
}
tree[pai] = max(tree[pai<<1],tree[(pai<<1) + 1]);
}
}
int query(int st,int dr,int pai)
{
if(inc <= st && dr <= sf)
{
return tree[pai];
}
if(sf < st || dr < inc)
{
return 0;
}
int mid = (st + dr) >> 1;
return max(query(st,mid,(pai<<1)),query(mid+1,dr,(pai<<1) + 1));
}
int main()
{
Input in("arbint.in");
freopen("arbint.out","w",stdout);
in>>n>>m;
for(int i=1;i<=n;i++)
{
in>>a[i];
pos = i;
val = a[i];
update(1,n,1);
}
for(int i=1;i<=m;i++)
{
int tip, a, b;
in>>tip>>a>>b;
if(tip)
{
pos = a;
val = b;
update(1,n,1);
}
else
{
inc = a;
sf = b;
printf("%d\n", query(1,n,1));
}
}
return 0;
}