#include <bits/stdc++.h>
#define MAX_N 100000
using namespace std;
FILE *f, *g;
int a, b;
int mx[MAX_N * 4 + 1];
int v[MAX_N + 1];
void buildArb(int poz, int st, int dr)
{
if(st == dr)
{
mx[poz] = v[st];
return;
}
int mid = (st + dr) / 2;
buildArb(2 * poz, st, mid);
buildArb(2 * poz + 1, mid + 1, dr);
mx[poz] = max(mx[poz * 2], mx[poz * 2 + 1]);
}
void update(int poz, int st, int dr)
{
if(st == dr)
{
v[st] = b;
mx[poz] = v[st];
return;
}
int mid = (st + dr) / 2;
if(a >= st && a <= mid)
update(poz * 2, st, mid);
else
if(a > mid && a <= dr)
update(poz * 2 + 1, mid + 1, dr);
mx[poz] = max(mx[poz * 2], mx[poz * 2 + 1]);
}
int getMax(int poz, int st, int dr, int a, int b)
{
if(st == dr)
return mx[poz];
if(st == a && dr == b)
return mx[poz];
int mid = (st + dr) / 2;
if(b <= mid)
return getMax(poz * 2, st, mid, a, b);
if(b > mid)
{
if(a > mid)
return getMax(poz * 2 + 1, mid + 1, dr, a, b);
else
return max(getMax(poz * 2, st, mid, a, mid), getMax(poz * 2 + 1, mid + 1, dr, mid + 1, b));
}
return 0;
}
void ansQues()
{
f = fopen("arbint.in", "r");
g = fopen("arbint.out", "w");
int n, m;
fscanf(f, "%d%d", &n, &m);
int i;
for(i = 1; i <= n; i ++)
fscanf(f, "%d", &v[i]);
buildArb(1, 1, n);
int type;
while(m > 0)
{
fscanf(f, "%d%d%d", &type, &a, &b);
if(type == 1)
update(1, 1, n);
else
if(type == 0)
fprintf(g, "%d\n", getMax(1, 1, n, a, b));
m --;
}
fclose(f);
fclose(g);
}
int main()
{
ansQues();
return 0;
}