0分求调,样例输出11 8 16
查看原帖
0分求调,样例输出11 8 16
1423841
gengyan楼主2024/11/8 23:57
#include<bits/stdc++.h>
#define ll long long
#define MAXN 500010
using namespace std;
ll a[500010];
ll n, m;
struct segement_tree{
    struct node{
        ll l, r, sum, lazy = 0;
    } tree[4 * MAXN]; //线段树
    void build(ll i,ll l,ll r)
    {
        tree[i].l = l;
        tree[i].r = r;
        if(l==r){
            tree[i].sum = a[l];
            return;
        }
        ll mid = (l + r) >> 1;
        build(i << 1, l, mid);
        build(i << 1 | 1, mid + 1, r);
        tree[i].sum = tree[i << 1].sum + tree[i << 1 | 1].sum;
    }
    void pushdown(ll i){
        if(tree[i].lazy!=0){
            tree[i<<1].lazy += tree[i].lazy;
            tree[i<<1|1].lazy += tree[i].lazy;
            tree[i<<1].sum += (tree[i<<1].r - tree[i<<1].l + 1) * tree[i].lazy;
            tree[i << 1 | 1].sum += (tree[i << 1 | 1].r - tree[i << 1 | 1].l + 1) * tree[i].lazy;
            tree[i].lazy = 0;
        }
        return;
    }
    ll sec_search(ll i,ll l,ll r){
        if(tree[i].l>=l&&tree[i].r<=r)
            return tree[i].sum;
        if(tree[i].l>r||tree[i].r<l)
            return 0;
        pushdown(i);
        ll s = 0;
        if(tree[i<<1].r>=l)
            s += sec_search(i << 1, l, r);
        if(tree[i<<1|1].l<=r)
            s += sec_search(i << 1 | 1, l, r);
        return s;
    }
    void pt_modify(ll i,ll x,ll k){
        if(tree[i].l==tree[i].r){
            tree[i].sum += k;
            return;
        }
        if(tree[i<<1].r>=x)
            pt_modify(i << 1, x, k);
        else
            pt_modify(i << 1 | 1, x, k);
        tree[i].sum = tree[i << 1].sum + tree[i << 1 | 1].sum;
    }
    void sec_modify(ll i,ll l,ll r,ll k){
        if(tree[i].l>=l&&tree[i].r<=r){
            tree[i].sum += (tree[i].r - tree[i].l + 1) * k;
            tree[i].lazy += k;
            return;
        }
        pushdown(i);
        if(tree[i<<1].r>=l)
            sec_modify(i << 1, l, r, k);
        if(tree[i<<1|1].l<=r)
            sec_modify(i << 1|1, l, r, k);
    }
    ll pt_search(ll i,ll x){
        if(tree[i].l==tree[i].r)
            return tree[i].sum;
        pushdown(i);
        if(tree[i<<1].r>=x)
            return pt_search(i << 1, x);
        else
            return pt_search(i << 1 | 1, x);
    }
} st;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    for (int i = 1; i <= n;i++)
        cin >> a[i];
    st.build(1, 1, n);
    for (int i = 0; i < m;i++){
        ll p, x, y, k;
        cin >> p;
        if(p==1){
            cin >> x >> y >> k;
            st.sec_modify(1, x, y, k);
        }
        else{
            cin >> x >> y;
            cout << st.sec_search(1, x, y) << '\n';
        }
    }
    return 0;
}
2024/11/8 23:57
加载中...