求调qwq
查看原帖
求调qwq
762037
Daydayup_Olivia楼主2024/2/29 13:35
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=1e5+10;
int num[N];
struct aa{
	int l,r;
	long long sum;
	int add;
}a[N*4];
int val[N]; 
void build(int i,int l,int r){
	a[i].l=l;
	a[i].r=r;
	if(l==r){//是叶节点 
		a[i].sum=val[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	a[i].sum=a[i<<1].sum+a[i<<1|1].sum;
}
long long query(int i,int l,int r){
	
	if(a[i].l==l&&a[i].r==r){
		return a[i].sum;
	}
	int mid=(a[i].l+a[i].r)>>1;
	if(mid>=r){
		return query(i<<1,l,r);
	}else if(mid<l){
		return query(i<<1|1,l,r);
	}
	return query(i<<1,l,mid)+query(i<<1|1,mid+1,r);
}
void updata(int i,int x,int y){//单点修改 
	if(a[i].l==a[i].r){
		a[i].sum+=y;
		return;
	}
	int mid=(a[i].l+a[i].r)>>1;
	if(x<=mid) updata(i<<1|1,x,y);
	else updata(i<<1|1,x,y);
	a[i].sum=a[i<<1].sum+a[i<<1|1].sum;
}
void down(int i){
	if(a[i].add){
		long long x=a[i].add;
		a[i<<1].add+=x;
		a[i<<1|1].add+=x;
		a[i<<1].sum+=(a[i<<1].r-a[i<<1].l+1)*x;
		a[i<<1|1].sum+=(a[i<<1|1].r-a[i<<1|1].l+1)*x;
		a[i].add=0;
	}
}
void up(int i){
	a[i].sum=0;
	if(a[i<<1].l){
		a[i].sum+=a[i<<1].sum;
	}
	if(a[i<<1|1].l){
		a[i].sum+=a[i<<1|1].sum;
	}
}
void uupdata(int i,int l,int r,int add){//区间修改long long
	if(a[i].l==l&&a[i].r==r){
		a[i].sum+=(a[i].r-a[i].l+1)*add;
		a[i].add+=add;
		return;
	}
	down(i);
	int mid=(a[i].l+a[i].r)>>1;
	if(mid>=r){
		uupdata(i<<1,l,r,add);
	
	}else if(mid<l){
		uupdata(i<<1|1,l,r,add);
	}else{
		uupdata(i<<1,l,mid,add);
		uupdata(i<<1|1,mid+1,r,add);
	}
	up(i);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>val[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int tmp;
		cin>>tmp;
		if(tmp==1){
			int x;
			int k;
			int y;
			cin>>x>>y>>k;
			uupdata(1,x,y,k);
		}
		if(tmp==2){
			int x;
			int y;
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	} 
	return 0;
}
2024/2/29 13:35
加载中...