线段树莫名RE,求调
查看原帖
线段树莫名RE,求调
358794
Xfer_splendor楼主2021/9/26 20:07
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;


struct SegmentTree{
	int l,r;
	long long sum,add;
	#define l(x) t[x].l
    #define r(x) t[x].r
	#define sum(x) t[x].sum
    #define add(x) t[x].add
} t[100100*4];

int n,m,a[100100],op;

void build (int p,int l,int r){
	l(p)=l; r(p)=r;
	if (l==r){
		sum(p)=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build (p*2,l,mid);
	build (p*2+1,mid+1,r);
	sum(p)=sum(p*2)+sum(p*2+1);
}
void spread (int p){
	if (add(p)){
		sum(p*2)+=add(p)*(r(p*2)-l(p*2)+1);
		sum(p*2+1)+=add(p)*(r(p*2+1)-l(p*2+1)+1);
		add(p*2)+=add(p);
		add(p*2+1)+=add(p);
		add(p)=0;
	}
}
void change (int p,int l,int r,int d){
	if (l<=l(p)&&r>=r(p)){
		sum(p)+=(long long)d*(r(p)-l(p)+1);
		add(p)+=d;
		return ;
    }
    spread (p);
    int mid=(l(p)+r(p))/2;
    if (l<=mid) change (p*2,l,r,d);
    if (r>mid) change (p*2+1,l,r,d);
    sum(p)=sum(p*2)+sum(p*2+1);
}
long long ask (int p,int l,int r){
	if (l<=l(p)&&r>=r(p)) return sum(p);
	spread (p);
	int mid=(l(p)+r(p))/2;
	long long val=0;
	if (l(p)<=mid) val+=ask (p*2,l,r);
	if (r(p)>mid) val+=ask (p*2+1,l,r);
	return val;
}
int main (){
    int l,r,k;
	cin>>n>>m;
	for (int i=1;i<=n;++i) cin>>a[i];
	build (1,1,n);
	for (int i=1;i<=m;++i){
		cin>>op>>l>>r; 
		if (op==1){
			cin>>k;
			change (1,l,r,k);
		}
		if (op==2){
			cout<<ask (1,l,r)<<"\n";
		}
	}
	return 0;
}
2021/9/26 20:07
加载中...