有大佬可以帮忙看看哪里有错吗?谢谢,一定给您点关注
查看原帖
有大佬可以帮忙看看哪里有错吗?谢谢,一定给您点关注
421128
Addrian楼主2022/3/21 21:59
#include<iostream>
using namespace std;
struct node{
	long long l,r,dat=0,biao=0;
}t[500050];
long long n,m,pd,tou,wei,jias,sum;
long long a[100050];
void build(int i,int l,int r){
	t[i].l=l;
	t[i].r=r;
	if(l==r){
		t[i].dat=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	t[i].dat=t[i*2].dat+t[i*2+1].dat;
}
void jia(int i){
	if(t[i].r<tou||t[i].l>wei) return ;
	if(tou<=t[i].l&&wei>=t[i].r){
		if(t[i].l==t[i].r){
			t[i].dat+=jias;
		}else{
			t[i].biao+=jias; 
		}
		return ;
	}
	if(t[i*2].r>=tou)jia(i*2);
	if(t[i*2+1].l<=wei)jia(i*2+1);
	t[i].dat=t[i*2].dat+t[i*2+1].dat;
}
void cha(int i){
	//cout<<tou<<" "<<wei<<endl;
	if(t[i].r<tou||t[i].l>wei) return ;
	if(tou<=t[i].l&&wei>=t[i].r){
		//cout<<"giao"<<t[i].l<<" "<<t[i].r<<endl;
		sum+=t[i].dat;
		sum+=t[i].biao*(t[i].r-t[i].l+1);
		//cout<<"giao";
		return ;
	}
	if(t[i].biao!=0){
		t[i*2].biao+=t[i].biao;
		t[i*2+1].biao+=t[i].biao;
		t[i].dat+=t[i].biao*(t[i].r-t[i].l+1);
		t[i].biao=0;
	}
	if(t[i*2].r>=tou)cha(i*2);
	if(t[i*2+1].l<=wei)cha(i*2+1);
}
int main(){
	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>>pd>>tou>>wei;
		if(pd==1){
			cin>>jias;
			jia(1);
		}else{
			sum=0;
			cha(1);
			cout<<sum<<endl;
		}
	}
	return 0;
}
2022/3/21 21:59
加载中...