线段树练习3

#include<iostream>
#include<cstdio>
#include<cstdlib>//wym's third xianduanshu
#define maxn 950000
#define ls (num<<1)
#define rs (num<<1|1)
using namespace std;
long long a[maxn],tree[maxn],size[maxn],lazy[maxn];
void build (long long num,long long l,long long r)
{
    size[num]=(r-l+1);
    if (l==r) 
    {
        tree[num]=a[l];
        return ;
    }
    long long mid=(l+r)>>1;
    build (ls,l,mid);
    build (rs,mid+1,r);
    tree[num]=tree[ls]+tree[rs];
}
void down (long long num)
{
    tree[ls]+=lazy[num]*size[ls];
    tree[rs]+=lazy[num]*size[rs];
    lazy[ls]+=lazy[num],lazy[rs]+=lazy[num];
    lazy[num]=0;
}
void update(long long num,long long l,long long r,long long x,long long y,long long z)
{
    if (l!=r) down(num);
    if (x<=l&&r<=y) 
    {
        tree[num]+=z*size[num];
        lazy[num]+=z;
        return ;
    }
    long long mid=(l+r)>>1;
    if (x<=mid) update(ls,l,mid,x,y,z);
    if (y>mid)  update(rs,mid+1,r,x,y,z);
    tree[num]=tree[ls]+tree[rs];
}
long long query(long long num,long long l,long long r,long long x,long long y)
{
    if (l!=r) down(num);
    if (x<=l&&r<=y) return tree[num];
    long long mid=(l+r)>>1;
    long long res=0;
    if (x<=mid) res+=query(ls,l,mid,x,y);
    if (y>mid)  res+=query(rs,mid+1,r,x,y);
    tree[num]=tree[ls]+tree[rs];
    return res;
}
int main()
{
    long long n,m;
    scanf ("%lld",&n);
    for (long long i=1;i<=n;++i)
        scanf ("%lld",&a[i]);
    build (1,1,n);
    scanf ("%lld",&m);
    for (long long i=1;i<=m;++i)
    {
        long long b,x,y,z;
        scanf ("%lld",&b);
        if (b==1)
        {
            scanf ("%lld%lld%lld",&x,&y,&z);
            update(1,1,n,x,y,z);
        }
        else  
        {
            scanf ("%lld%lld",&x,&y);
            printf("%lld\n",query(1,1,n,x,y));
        }
    }
    return 0;
}

这次一小时死于只输入一个lld
大概不是智商问题而是视力问题
绝望

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值