58pts 求助
查看原帖
58pts 求助
678858
ShiRoZeTsuHL卜奎BBQ!楼主2023/9/5 15:02

不是 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;
}
2023/9/5 15:02
加载中...