#include <bits/stdc++.h>
typedef int ll;
using namespace std;
const ll inf = 1e9 + 10, MAXN = 42e6;
struct sec {
ll val, l, r;
sec(ll v, ll lf, ll rg) {
val = v;
l = lf;
r = rg;
}
sec() {
val = l = r = 0;
}
};
struct opr {
ll val;
opr(ll v) {
val = v;
}
opr() {
val = inf;
}
};
struct segTree {
ll rt[MAXN];
sec val[MAXN];
opr tag[MAXN];
ll size, rc;
void pushdown(ll x) {
if (tag[x].val > 1e9) {
return;
}
tag[val[x].l].val = tag[x].val;
val[val[x].l].val = tag[val[x].l].val;
tag[val[x].r].val = tag[x].val;
val[val[x].r].val = tag[val[x].r].val;
tag[x] = tag[0] = opr();
val[0] = sec();
}
void pushup(ll x) {
val[x].val = 0;
}
segTree() {
rt[0] = 1;
val[0] = sec();
tag[0] = opr();
val[1] = sec();
tag[1] = opr();
size = 1;
rc = 0;
}
ll clone(ll x) {
ll nn = ++size;
val[nn] = sec(val[x].val, val[x].l, val[x].r);
tag[nn] = opr();
return nn;
}
ll mdf(ll x, ll lx, ll rx, ll l, ll r, ll k, bool isrt = 0) {
if (r <= lx || rx <= l) {
return x;
}
x = clone(x);
if (isrt) {
rt[++rc] = x;
}
if (l <= lx && rx <= r) {
tag[x].val = val[x].val = k;
return x;
}
pushdown(x);
ll mid = (lx + rx) / 2;
ll lc = mdf(val[x].l, lx, mid, l, r, k);
val[x].l = lc;
ll rc = mdf(val[x].r, mid, rx, l, r, k);
val[x].r = rc;
pushup(x);
return x;
}
pair<ll, ll> qry(ll x, ll lx, ll rx, ll l, ll r, bool isrt = 0) {
if (r <= lx || rx <= l) {
return make_pair(x, 0);
}
x = clone(x);
if (isrt) {
rt[++rc] = x;
}
if (l <= lx && rx <= r) {
return make_pair(x, val[x].val);
}
pushdown(x);
ll mid = (lx + rx) / 2, ret = 0;
auto lq = qry(val[x].l, lx, mid, l, r);
val[x].l = lq.first;
ret += lq.second;
auto rq = qry(val[x].r, mid, rx, l, r);
val[x].r = rq.first;
ret += rq.second;
return make_pair(x, ret);
}
void out() {
cerr << "rts: ";
for (ll i = 0; i <= rc; i++) {
cerr << rt[i] << " ";
}
cerr << endl;
for (ll i = 1; i <= size; i++) {
cerr << i << " val: " << val[i].val << " l: " << val[i].l << " r: " << val[i].r << " tag: " << tag[i].val << endl;
}
cerr << "--------------------------------------------------------------------" << endl;
}
} st;
ll n, q;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (ll i = 1, v; i <= n; i++) {
// st.out();
cin >> v;
st.mdf(st.rt[i - 1], 1, n + 1, i, i + 1, v, 1);
}
while (q--) {
// st.out();
ll ver, o, l, v;
cin >> ver >> o >> l;
if (o == 1) {
cin >> v;
st.mdf(st.rt[ver + n], 1, n + 1, l, l + 1, v, 1);
} else {
cout << st.qry(st.rt[ver + n], 1, n + 1, l, l + 1, 1).second << endl;
}
}
// st.out();
return 0;
}
MAXN已经小到极限了,41.9e6都会RE on #2(link)