样例不过求条
查看原帖
样例不过求条
1365127
dendky楼主2025/6/15 18:33
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n, m, a[N];
struct node {
    ll l, r, w, lz;
}tree[N<<2];
void build(ll u, ll l, ll r) {
    tree[u].lz=0;
    tree[u].l=l, tree[u].r=r;
    if (l==r) {
        tree[u].w=a[l];
        return;
    }
    ll mid=l+r>>1;
    build((u<<1)+1, mid+1, r), build(u<<1, l, mid);
    tree[u].w = tree[u<<1].w + tree[(u<<1)+1].w;
}
void maketag(ll u, ll len, ll k) {
    tree[u].lz+=k;
    tree[u].w+=len*k;
}
void update(ll u, ll l, ll r, ll L, ll R, ll k) {
    if (L>=l && R<=r) maketag(u, L-R+1, k);
    else if (L<l && R>r) return;
    else {
        ll mid=l+r>>1;
        maketag(u<<1, mid-l+1, tree[u].lz), maketag((u<<1)+1, r-mid, tree[u].lz);
        tree[u].lz=0;
        update(u<<1, l, mid, L, R, k), update((u<<1)+1, mid+1, r, L, R, k);
        tree[u].w = tree[u<<1].w + tree[(u<<1)+1].w;
    }
}
ll query(ll u, ll l, ll r, ll L, ll R) {
    if (L>=l && R<=r) return tree[u].w;
    else if (L<l && R>r) return 0;
    else {
        ll mid=l+r>>1;
        maketag(u<<1, mid-l+1, tree[u].lz), maketag((u<<1)+1, r-mid, tree[u].lz);
        tree[u].lz=0;
        return query(u<<1, l, mid, L, R) + query((u<<1)+1, mid+1, r, L, R);
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin>>n>>m;
    for (int i=1; i<=n; i++) cin>>a[i];
    build(1, 1, n);
    while (m--) {
        ll opt, x, y;
        cin>>opt>>x>>y;
        if (opt==1) {
            ll k;
            cin>>k;
            update(1, 1, n, x, y, k);
        }else cout<<query(1, 1, n, x, y)<<"\n";
    }
    return 0;
}

看得自己人麻了,实在找不到哪里出了问题,求条qwq

2025/6/15 18:33
加载中...