萌新找不到哪儿错了,在此求助
查看原帖
萌新找不到哪儿错了,在此求助
1614903
Zeht楼主2025/7/28 20:50
#include<bits/stdc++.h>
using namespace std;
#define MAXN 100010
#define ll long long

int n,m;
int rt,t,l,r,k;
int a[MAXN];
int sum[MAXN];

struct Segmentree{
	int l,r;
	long long sum,tag;
}tree[4*MAXN];

ll cal(int p){
	return tree[p].sum+=tree[p].tag*(tree[p].r-tree[p].l+1);
}

void push_up(int p){
	tree[p].sum=cal(2*p)+cal(2*p+1);
}

void push_down(int p){
	if(tree[p].tag==0){
		return;
	}
	tree[2*p].tag+=tree[p].tag;
	tree[2*p+1].tag+=tree[p].tag;
	tree[p].sum=cal(p);
	tree[p].tag=0;
}

void change(int p,int ql,int qr,int dv){
	if(ql<=tree[p].l&&qr>=tree[p].r){
		tree[p].sum+=dv*(tree[p].r-tree[p].l+1);
		tree[p].tag+=dv;
		return;
	}
	push_down(p);
	int mid=(tree[p].l+tree[p].r)/2;
	if(qr<=mid){
		change(2*p,ql,qr,dv);
	}else if(ql>=mid+1){
		change(2*p+1,ql,qr,dv);
	}else{
		change(2*p,ql,mid,dv);
		change(2*p+1,mid+1,qr,dv);
	}
	push_up(p);
}

ll query(int p,int ql,int qr){
	if(tree[p].l==ql&&tree[p].r==qr){
		return cal(p);
	}
}

ll build(int p,int l,int r){
	tree[p].l=l;
	tree[p].r=r;
	if(l==r){
		tree[p].sum=a[l];
		return p;
	}else{
		int mid=(l+r)/2;
		tree[p].l=build(2*p,l,mid);
		tree[p].r=build(2*p+1,mid+1,r);
		push_up(p);
		return p;
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	rt=build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>t;
		if(t==1){
			cin>>l>>r>>k;
			change(rt,l,r,k);
		}else{
			cin>>l>>r;
			cout<<query(rt,l,r)<<endl;
		}
	}
	return 0;
}
2025/7/28 20:50
加载中...