RE求助
查看原帖
RE求助
569236
yf0207楼主2022/10/5 10:49
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=400010;
int p[N],n,m;
struct node
{
    int l=0,r=0,sum=0,lazy=0;
}a[N];
void update(int k)
{
    a[k].sum=a[k*2].sum+a[k*2+1].sum;
    return;
}
void build(int k,int l,int r)
{
    a[k].l=l;a[k].r=r;
    if(l==r)
    {
        a[k].sum=p[l];
        return;
    }
    int mid=(l+r)/2;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    update(k);
}
void down(int k)
{
    if(!a[k].lazy)return;
    a[k*2].sum+=(a[k*2].r-a[k*2].l+1)*a[k].lazy;
	a[k*2+1].sum+=(a[k*2+1].r-a[k*2+1].l+1)*a[k].lazy;
	a[k*2].lazy+=a[k].lazy;
	a[k*2+1].lazy+=a[k].lazy;
	a[k].lazy=0;
}
void changes(int k,int l,int r,int x)
{
	if(a[k].l>=l&&a[k].r<=r)
	{
		a[k].sum+=(a[k].r-a[k].l+1)*x;
		a[k].lazy+=x;
		return;
	}
	down(k);
	int mid=(a[k].l+a[k].r)/2;
	if(r>mid)
	{
	    changes(k*2+1,l,r,x);
	    return;
	}
	if(l<=mid)
	{
	    changes(k*2,l,r,x);
	    return;
	}
	changes(k*2,l,mid,x);
	changes(k*2+1,mid+1,r,x);
	update(k);
}
int query(int k,int l,int r)
{
    if(a[k].l>=l&&a[k].r<=r)return a[k].sum;
	down(k);
	int mid=(a[k].l+a[k].r)/2,ret=0;
	if(l<=mid) ret+=query(k*2,l,r);
	if(r>mid) ret+=query(k*2+1,l,r);
	return ret;
}
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",&p[i]);
    build(1,1,n);
    while(m--)
    {
        int opt,x,y,k;
        cin>>opt;
        if(opt==1)
        {
            scanf("%d%d%d",&x,&y,&k);
            changes(1,x,y,k);
        }
        if(opt==2)
        {
            scanf("%d%d%d",&x,&y);
            printf("%d",query(1,x,y));
        }
    }
    return 0;
}
2022/10/5 10:49
加载中...