不是 long long 的问题,但是目前找不到
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
struct node {
int ls, rs; ll v;
} t[maxn<<5];
int n, m, cnt = 1, tot, top;
int stk[maxn], rt[maxn];
#define mid ((l + r) >> 1)
int newnode() {
if(top) {
top--;
return stk[top+1];
}
else return ++tot;
}
void del(int x) {
t[x].ls = t[x].rs = t[x].v = 0;
stk[++top] = x;
}
void add(int &o, int l, int r, int pos, ll val) {
if(!o) o = newnode();
if(l == r) {
t[o].v += val;
return;
}
if(pos <= mid) add(t[o].ls, l, mid, pos, val);
else add(t[o].rs, mid+1, r, pos, val);
t[o].v = t[t[o].ls].v + t[t[o].rs].v;
}
void split(int& o, int& p, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr) {
o = p;
p = 0;
return;
}
if(!o) o = newnode();
if(ql <= mid) split(t[o].ls, t[p].ls, l, mid, ql, qr);
if(mid < qr) split(t[o].rs, t[p].rs, mid+1, r, ql, qr);
t[o].v = t[t[o].ls].v + t[t[o].rs].v;
t[p].v = t[t[p].ls].v + t[t[p].rs].v;
}
void merge(int& o, int& p) {
if(!o) {
o = p;
p = 0;
return;
}
if(t[p].ls) merge(t[o].ls, t[p].ls);
if(t[p].rs) merge(t[o].rs, t[p].rs);
t[o].v = t[t[o].ls].v + t[t[o].rs].v;
del(p);
}
ll getcnt(int o, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr) return t[o].v;
ll res = 0;
if(ql <= mid) res += getcnt(t[o].ls, l, mid, ql, qr);
if(mid < qr) res += getcnt(t[o].rs, mid+1, r, ql, qr);
return res;
}
int query(int o, int l, int r, ll pos) {
if(l == r) return l;
if(pos <= t[t[o].ls].v) return query(t[o].ls, l, mid, pos);
else return query(t[o].rs, mid+1, r, pos-t[t[o].ls].v);
}
int main() {
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
ll x; scanf("%lld", &x);
if(x) add(rt[1], 1, n, i, x);
}
int op; ll x, y, z;
for(int i = 1; i <= m; i++) {
scanf("%d %lld %lld", &op, &x, &y);
if(op != 1 && op != 4) scanf("%lld", &z);
if(op == 0) split(rt[++cnt], rt[x], 1, n, y, z);
else if(op == 1) merge(rt[x], rt[y]);
else if(op == 2) add(rt[x], 1, n, z, y);
else if(op == 3) printf("%lld\n", getcnt(rt[x], 1, n, y, z));
else {
if(y > t[rt[x]].v) printf("%d\n", -1);
else printf("%d\n", query(rt[x], 1, n, y));
}
}
return 0;
}