0pts求调
查看原帖
0pts求调
1399537
liangcc楼主2025/1/24 20:46
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int n, m, w[N];
struct node{
    int l, r;
    LL sum, add;
} tr[N * 4];
void pushup(int u){
    tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void pushdown(int u){
    auto &t = tr[u], &l = tr[u << 1], &r = tr[u << 1 | 1];
    if(t.add){
        l.add += t.add, l.sum += (LL)(l.r - l.l + 1) * t.add;
        r.add += t.add, r.sum += (LL)(r.r - r.l + 1) * t.add;
        t.add = 0;
    }
}
void build(int u, int l, int r){
    if(l == r) tr[u] = {l ,r, w[r] - w[r - 1], 0};
    else{
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}
void modify(int u, int l, int r, LL d){
    if(tr[u].l >= l && tr[u].r <= r){
        tr[u].sum += (LL)(tr[u].r - tr[u].l + 1) * d;
        tr[u].add += d;
    }
    else{
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        if(l <= mid) modify(u << 1, l ,r, d);
        if(r > mid) modify(u << 1 | 1, l, r, d);
        pushup(u);
    }
}
LL query(int u, int l, int r){
    if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
    pushdown(u);
    int mid = tr[u].l + tr[u].r >> 1;
    LL v;
    if(l <= mid) v += query(u << 1, l, r);
    if(r > mid) v += query(u << 1 | 1, l, r);
    return v;
}
int main(){
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);
    build(1, 1, n);
    while(m -- ){
        LL op, l, r, k, d;
        scanf("%lld%lld", &op, &l);
        if(op == 1){
            scanf("%lld%lld%lld", &r, &k, &d);
            modify(1, l, l, k);
            modify(1, l + 1, r, d);
            modify(1, r + 1, r + 1, -(k + (r - l) * d));
        }
        else printf("%lld\n", query(1, 1, l));
    }
    return 0;
}

2025/1/24 20:46
加载中...