线段树练习3

    xiaoxiao2021-03-25  23

    #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 大概不是智商问题而是视力问题 绝望

    转载请注明原文地址: https://ju.6miu.com/read-300029.html

    最新回复(0)