#20WA,95pts needHELP
查看原帖
#20WA,95pts needHELP
1110839
Fallen67楼主2025/7/27 16:23
#include<cstdio>
#define N 100003
#define ll long long
using namespace std;
struct tree
{
    int l,r;
    ll sum;
    ll lztag;
}t[N*4];
int n,m;
ll a[N];
void pushdown(int p)
{
    if(t[p].lztag && t[p].l != t[p].r)
    {
        int lson = p*2, rson = p*2+1;
        t[lson].lztag += t[p].lztag;
        t[rson].lztag += t[p].lztag;
        t[lson].sum += t[p].lztag * (t[lson].r - t[lson].l + 1);
        t[rson].sum += t[p].lztag * (t[rson].r - t[rson].l + 1);
        t[p].lztag = 0;
    }
    return ;
}
void build(int l,int r,int p)
{
    t[p].l = l, t[p].r = r, t[p].lztag = 0;
    if(l == r)
    {
        t[p].sum = a[l];
        return;
    }
    int mid = (l + r) / 2;
    build(l, mid, 2*p);
    build(mid+1, r, 2*p+1);
    t[p].sum = t[2*p].sum + t[2*p+1].sum;
    return ;
}
void modify(int l,int r,int p,int v)
{
    if(l <= t[p].l && t[p].r <= r)
    {
        t[p].sum += (ll)v * (t[p].r - t[p].l + 1);
        t[p].lztag += v;
        return;
    }
    pushdown(p);
    int mid = (t[p].l + t[p].r) / 2;
    if(r <= mid) modify(l, r, 2*p, v);
    else if(l > mid) modify(l, r, 2*p+1, v);
    else {
        modify(l, mid, 2*p, v);
        modify(mid+1, r, 2*p+1, v);
    }
    t[p].sum = t[2*p].sum + t[2*p+1].sum;
    return ;
}
ll query(int l,int r,int p)
{
    if(l <= t[p].l && t[p].r <= r)
        return t[p].sum;
    pushdown(p);
    int mid = (t[p].l + t[p].r) / 2;
    if(r <= mid) return query(l, r, 2*p);
    if(l > mid) return query(l, r, 2*p+1);
    return query(l, mid, 2*p) + query(mid+1, r, 2*p+1);
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    build(1,n,1);
    for(int i=1;i<=m;i++)
    {
        int op;
        scanf("%d",&op);
        if(op==1)
        {
            int lp,rp,k;
            scanf("%d%d%d",&lp,&rp,&k);
            modify(lp,rp,1,k);
        }
        else if(op==2)
        {
            int lp,rp;
            scanf("%d%d",&lp,&rp);
            ll v=query(lp,rp,1);
            printf("%lld\n",v);
        }
    }
    return 0;
}
2025/7/27 16:23
加载中...