#include <bits/stdc++.h>
#include <iostream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int tree[100002],v[10002];
void update(int a,int b,int nod,int st,int dr)
{
if(a<st || a>dr) return;
if(a==st && a==dr)
{
tree[nod]=b;
return;
}
int mij=(st+dr)/2;
if(a>=st && a<=dr)
{
update(a,b,2*nod,st,mij);
update(a,b,2*nod+1,mij+1,dr);
}
tree[nod]=tree[nod*2]*10+tree[nod*2+1];
}
void build_tree(int nod, int st, int dr)
{
if(st == dr)
{
tree[nod] = v[st];
return;
}
int mij = (st + dr) / 2;
build_tree(2 * nod, st, mij);
build_tree(2 * nod + 1, mij + 1, dr);
tree[nod] = tree[2 * nod]*10 + tree[2 * nod + 1];
}
int query(int a,int b,int nod,int st,int dr)
{
int mij, max1, max2;
if (st==dr)
{
if(st<a || dr>b)
return 0;
else return tree[nod];
}
else
{
mij=(st+dr)/2;
max1=query(a,b,nod*2,st,mij);
max2=query(a,b,nod*2+1,mij+1,dr);
if (max1>max2)
return max1;
else
return max2;
}
}
int N,M,X,A,B;
int main()
{
f>>N>>M;
for(int i=1; i<=N; i++)
f>>v[i];
build_tree(1,1,N);
for(int i=1; i<=M; i++)
{
f>>X;
f>>A;
f>>B;
if(X==1)
{
update(A,B,1,1,N);
}
if(X==0)
g<<query(A,B,1,1,N)<<endl;
}
}