#include <bits/stdc++.h>
#define N 400005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
int g[N], lazy[N];
void shift(int node){
if(!lazy[node]) return;
g[node] = lazy[node];
if(node * 2 + 1 < N) // the lazy value has to be margeable
lazy[node * 2] =
lazy[node * 2 + 1] = lazy[node];
lazy[node] = 0;
}
void update(int val, int L, int R, int node = 1, int l = 1, int r = n){
shift(node);
if(L <= l && r <= R){
lazy[node] = val;
shift(node);
return;
}
if(l > R || r < L) return;
int mij = (l + r) / 2;
update(val, L, R, node * 2, l, mij);
update(val, L, R, node * 2 + 1, mij + 1, r);
g[node] = max(g[node * 2], g[node * 2 + 1]);
}
int query(int L, int R, int node = 1, int l = 1, int r = n){
shift(node);
if(L <= l && r <= R) return g[node];
int mij = (l + r) / 2;
if(l > R || r < L) return -1;
return max( query(L, R, node * 2, l, mij),
query(L, R, node * 2 + 1, mij + 1, r));
}
int main(){
int a, b, op, val;
fin >> n >> m;
for (int i = 1; i <= n; i++){
fin >> val;
update(val, i, i);
}
for (int i = 1; i <= m; i++){
fin >> op >> a >> b;
if (op)
update(b, a, a);
else
fout << query(a, b) << '\n';
}
return 0;
}