再次求条(来自蒟蒻的呐喊)!
查看原帖
再次求条(来自蒟蒻的呐喊)!
1382038
linruicong_gegeji楼主2025/7/28 18:40

题面
记录

#include<bits/stdc++.h>
using namespace std;
int n,m,mid,a[100005],xx,yy,zz,uu;
struct str{
    int lch,rch,lazy;
    long long val;
}tree[400005];
inline void update(int x){tree[x].val=tree[x*2].val+tree[x*2+1].val;}
inline void build(int x,int l,int r)
{
    tree[x].lch=l;
    tree[x].rch=r;
    tree[x].lazy=0;
    if(l==r)
    {
        tree[x].val=a[l];
        return;
    }
    mid=(l+r)>>1;
    build(x*2,l,mid);
    build(x*2+1,mid+1,r);
    update(x);
}
inline void down(int x)
{
    if(tree[x].lazy==0)return;
    if(tree[x].lch==tree[x].rch)
    {
        tree[x].lazy=0;
        return;
    }
    int left_len=tree[x*2].rch-tree[x*2].lch+1;
    int right_len=tree[x*2+1].rch-tree[x*2+1].lch+1;
    tree[x*2].val+=(long long)left_len*tree[x].lazy;
    tree[x*2].lazy+=tree[x].lazy;
    tree[x*2+1].val+=(long long)right_len*tree[x].lazy;
    tree[x*2+1].lazy+=tree[x].lazy;
    tree[x].lazy=0;
}
inline void changes(int k,int l,int r,int x)
{
    if(l<=tree[k].lch&&tree[k].rch<=r)
    {
        tree[k].val+=(long long)(tree[k].rch-tree[k].lch+1)*x;
        tree[k].lazy+=x;
        return;
    }
    down(k);
    mid=(tree[k].lch+tree[k].rch)>>1;
    if(l<=mid)changes(k*2,l,r,x);
    if(r>mid)changes(k*2+1,l,r,x);
    update(k);
}
inline long long asks(int x,int l,int r)
{
    if(l<=tree[x].lch&&tree[x].rch<=r) return tree[x].val;
    down(x);
    mid=(tree[x].lch+tree[x].rch)>>1;
    long long res=0;
    if(l<=mid)res+=asks(x*2,l,r);
    if(r>mid)res+=asks(x*2+1,l,r);
    return res;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&xx);
        if(xx==1)
        {
            scanf("%d%d%d",&yy,&zz,&uu);
            changes(1,yy,zz,uu);    
        }
        else
        {
            scanf("%d%d",&yy,&zz); 
            printf("%lld\n",asks(1,yy,zz));
        }
    }
    return 0;
}
2025/7/28 18:40
加载中...