#include <cstdio>
#define maxim(a,b) ( (a > b) ? a : b )
int v[100001], arb[1000001],n,m,nrmax;
void update(int s,int d,int val,int nod,int poz){
if(s == d){arb[nod] = val;return;}
int mij = ((s+d) >> 1);
if(poz <= mij)update(s,mij,val,nod<<1,poz);
else update(mij+1,d,val,(nod<<1)+1,poz);
arb[nod] = maxim(arb[nod<<1],arb[(nod<<1)+1]);
}
void cautare(int s,int d, int a,int b,int nod){
int mij = ((s+d) >> 1);
if(a<=s && d<=b){nrmax = ((arb[nod] > nrmax) ? arb[nod] : nrmax);return;}
else {
if(a <= mij)cautare(s,mij,a,b,(nod << 1));
if(mij < b)cautare(mij+1,d,a,b,((nod << 1)+1));
}
}
int main()
{freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%i %i",&n,&m);
for(int i = 1;i<=n;i++){
scanf("%i",&v[i]);
update(1,n,v[i],1,i);
}
int a,b,c;
while(m--){
scanf("%i %i %i",&a,&b,&c);
if(a == 1)update(1,n,c,1,b);
else {nrmax = -1;
cautare(1,n,b,c,1);
printf("%i \n",nrmax);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}