#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define l long
#define d double
#define si(x) scanf('%d', &x)
#define sl(x) scanf('%lld', &x)
#define ss(s) scanf('%s', s)
#define pi(x) printf('%d', x)
#define pl(x) printf('%lld', x)
#define ps(s) printf('%s', s)
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define clr(x) memset(x, 0, sizeof(x))
#define sortall(x) sort(all(x))
typedef pair<int, int> pii;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
#define modulo 1000000007
#define FOR(i,a,b) for(int i=a;i<=b;i++)
typedef vector<pii> vpii;
#define NMAX 100002
ifstream fin("abrint.in");
ofstream fout("abrint.out");
long arbore[4*NMAX], valori[NMAX];
long pozitie, valoare, start, stop;
void create(long node, long left, long right)
{
if(left == right)
arbore[node] = valori[left];
else{
long middle = left + (right - left)/2;
create(2*node, left, middle);
create(2*node + 1, middle + 1, right);
arbore[node] = max(arbore[2*node], arbore[2*node + 1]);
}
}
void change_value(long node, long left, long right)
{
if(left == right)
{
arbore[node] = valoare;
}
else{
long middle = left + (right - left)/2;
if(pozitie <= middle)
{
change_value(2*node, left, middle);
}
else{
change_value(2*node+1, middle + 1, right);
}
arbore[node] = max(arbore[2*node], arbore[2*node + 1]);
}
}
void query(long node, long left, long right)
{
if(start <= left && right <= stop)
{
valoare = max(valoare, arbore[node]);
}
else{
long middle = left + (right - left)/2;
if(start <= middle)
{
query(2*node, left, middle);
}
else
query(2*node +1, middle+1, right);
}
}
int main()
{
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
long n,m;
fin>>m>>n;
FOR(i,1,n)
{
fin>>valori[i];
}
create(1,1,n);
int querry, a, b;
while(m--)
{
fin>>querry;
if(querry)
{
fin>>pozitie>>valoare;
change_value(1,1,n);
}
else
{
fin>>start>>stop;
valoare = 0;
query(1,1,n);
fout<<valoare<<'\n';
}
}
return 0;
}