#include <bits/stdc++.h>
using namespace std;
const int N = 10000 + 10;
const int Q = 100000 + 10;
const int LOG = 15;
struct Node {
int val, lc, rc;
};
int a[N];
int ver[Q];
Node mem[2*N+Q*LOG];
int tot;
int build(int begin, int end) {
if (begin == end) {
mem[tot].val = a[begin];
return tot ++;
}
int mid = (begin + end) / 2, u = tot ++;
mem[u].lc = build(begin, mid);
mem[u].rc = build(mid + 1, end);
mem[u].val = max(mem[mem[u].lc].val, mem[mem[u].rc].val);
return u;
}
int update(int root, int begin, int end, int loc, int val) {
if (begin == end) {
mem[tot].val = val;
return tot ++;
}
int mid = (begin + end) / 2, u = tot ++;
if (loc <= mid) {
mem[u].lc = update(mem[root].lc, begin, mid, loc, val);
mem[u].rc = mem[root].rc;
}
else {
mem[u].lc = mem[root].lc;
mem[u].rc = update(mem[root].rc, mid + 1, end, loc, val);
}
mem[u].val = max(mem[mem[u].lc].val, mem[mem[u].rc].val);
return u;
}
int query(int root, int begin, int end, int left, int right) {
if (left <= begin && right >= end) return mem[root].val;
int mid = (begin + end) / 2;
if (right <= mid) return query(mem[root].lc, begin, mid, left, right);
else if (left > mid) return query(mem[root].rc, mid + 1, end, left, right);
else return max(query(mem[root].lc, begin, mid, left, mid), query(mem[root].rc, mid + 1, end, mid + 1, right));
}
int main() {
int n, q, s = 0, op, k, p, v, l, r;
scanf("%d %d", &n, &q);
for (int i=1; i<=n; i++) scanf("%d", &a[i]);
ver[++s] = build(1, n);
while (q --) {
scanf("%d %d", &op, &k);
if (op == 0) {
scanf("%d %d", &l, &r);
printf("%d\n", query(ver[k], 1, n, l, r));
}
else {
scanf("%d %d", &p, &v);
ver[++s] = update(ver[k], 1, n, p, v);
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IE4gPSAxMDAwMCArIDEwOwpjb25zdCBpbnQgUSA9IDEwMDAwMCArIDEwOwpjb25zdCBpbnQgTE9HID0gMTU7CgpzdHJ1Y3QgTm9kZSB7CglpbnQgdmFsLCBsYywgcmM7Cn07CgppbnQgYVtOXTsKaW50IHZlcltRXTsKTm9kZSBtZW1bMipOK1EqTE9HXTsKaW50IHRvdDsKCmludCBidWlsZChpbnQgYmVnaW4sIGludCBlbmQpIHsKCWlmIChiZWdpbiA9PSBlbmQpIHsKCQltZW1bdG90XS52YWwgPSBhW2JlZ2luXTsKCQlyZXR1cm4gdG90ICsrOwoJfQoJaW50IG1pZCA9IChiZWdpbiArIGVuZCkgLyAyLCB1ID0gdG90ICsrOwoJbWVtW3VdLmxjID0gYnVpbGQoYmVnaW4sIG1pZCk7CgltZW1bdV0ucmMgPSBidWlsZChtaWQgKyAxLCBlbmQpOwoJbWVtW3VdLnZhbCA9IG1heChtZW1bbWVtW3VdLmxjXS52YWwsIG1lbVttZW1bdV0ucmNdLnZhbCk7CglyZXR1cm4gdTsKfQoKaW50IHVwZGF0ZShpbnQgcm9vdCwgaW50IGJlZ2luLCBpbnQgZW5kLCBpbnQgbG9jLCBpbnQgdmFsKSB7CglpZiAoYmVnaW4gPT0gZW5kKSB7CgkJbWVtW3RvdF0udmFsID0gdmFsOwoJCXJldHVybiB0b3QgKys7Cgl9CglpbnQgbWlkID0gKGJlZ2luICsgZW5kKSAvIDIsIHUgPSB0b3QgKys7CglpZiAobG9jIDw9IG1pZCkgewoJCW1lbVt1XS5sYyA9IHVwZGF0ZShtZW1bcm9vdF0ubGMsIGJlZ2luLCBtaWQsIGxvYywgdmFsKTsKCQltZW1bdV0ucmMgPSBtZW1bcm9vdF0ucmM7Cgl9CgllbHNlIHsKCQltZW1bdV0ubGMgPSBtZW1bcm9vdF0ubGM7IAoJCW1lbVt1XS5yYyA9IHVwZGF0ZShtZW1bcm9vdF0ucmMsIG1pZCArIDEsIGVuZCwgbG9jLCB2YWwpOwoJfQoJbWVtW3VdLnZhbCA9IG1heChtZW1bbWVtW3VdLmxjXS52YWwsIG1lbVttZW1bdV0ucmNdLnZhbCk7CglyZXR1cm4gdTsKfQoKaW50IHF1ZXJ5KGludCByb290LCBpbnQgYmVnaW4sIGludCBlbmQsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKCWlmIChsZWZ0IDw9IGJlZ2luICYmIHJpZ2h0ID49IGVuZCkgcmV0dXJuIG1lbVtyb290XS52YWw7CglpbnQgbWlkID0gKGJlZ2luICsgZW5kKSAvIDI7CglpZiAocmlnaHQgPD0gbWlkKSByZXR1cm4gcXVlcnkobWVtW3Jvb3RdLmxjLCBiZWdpbiwgbWlkLCBsZWZ0LCByaWdodCk7CgllbHNlIGlmIChsZWZ0ID4gbWlkKSByZXR1cm4gcXVlcnkobWVtW3Jvb3RdLnJjLCBtaWQgKyAxLCBlbmQsIGxlZnQsIHJpZ2h0KTsKCWVsc2UgcmV0dXJuIG1heChxdWVyeShtZW1bcm9vdF0ubGMsIGJlZ2luLCBtaWQsIGxlZnQsIG1pZCksIHF1ZXJ5KG1lbVtyb290XS5yYywgbWlkICsgMSwgZW5kLCBtaWQgKyAxLCByaWdodCkpOwp9CgppbnQgbWFpbigpIHsKCWludCBuLCBxLCBzID0gMCwgb3AsIGssIHAsIHYsIGwsIHI7CglzY2FuZigiJWQgJWQiLCAmbiwgJnEpOwoJZm9yIChpbnQgaT0xOyBpPD1uOyBpKyspIHNjYW5mKCIlZCIsICZhW2ldKTsKCXZlclsrK3NdID0gYnVpbGQoMSwgbik7Cgl3aGlsZSAocSAtLSkgewoJCXNjYW5mKCIlZCAlZCIsICZvcCwgJmspOwoJCWlmIChvcCA9PSAwKSB7CgkJCXNjYW5mKCIlZCAlZCIsICZsLCAmcik7CgkJCXByaW50ZigiJWRcbiIsIHF1ZXJ5KHZlcltrXSwgMSwgbiwgbCwgcikpOwoJCX0KCQllbHNlIHsKCQkJc2NhbmYoIiVkICVkIiwgJnAsICZ2KTsKCQkJdmVyWysrc10gPSB1cGRhdGUodmVyW2tdLCAxLCBuLCBwLCB2KTsKCQl9Cgl9CglyZXR1cm4gMDsKfQ==