爆0求助
查看原帖
爆0求助
198964
Msents楼主2021/11/28 15:38

RT

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int a[100000+5];
struct node{
	int l,r;
	int sum,add;
}tree[100000*4+5];
int BuildTree(int k,int l,int r){
	tree[k].l=l;tree[k].r=r;
	if(l==r)return tree[k].sum=a[l];
	return tree[k].sum=BuildTree((k<<1),l,((l+r)>>1))+BuildTree((k<<1|1),((l+r)>>1)+1,r);
}
void PushDown(int k){
	if(tree[k].add){
		tree[k<<1].sum+=tree[k].add*(tree[k<<1].r-tree[k<<1].l+1);
		tree[k<<1|1].sum+=tree[k].add*(tree[k<<1|1].r-tree[k<<1|1].l+1);
		tree[k<<1].add+=tree[k].add;
		tree[k<<1|1].add+=tree[k].add;
		tree[k].add=0;
	}
}
int Add(int k,int l,int r,int addk){
	if(tree[k].r<l||tree[k].l>r)return 0;
	if(tree[k].l>=l&&tree[k].r<=r){
		tree[k].sum+=addk*(tree[k].r-tree[k].l+1);
		tree[k].add+=addk;
		return tree[k].sum;
	}
	PushDown(k);
	return tree[k].sum=Add((k<<1),l,r,addk)+Add((k<<1|1),l,r,addk);
}
int Query(int k,int l,int r){
	if(tree[k].r<l||tree[k].l>r)return 0;
	if(tree[k].l>=l&&tree[k].r<=r){
//		cout<<tree[k].l<<"e"<<tree[k].r<<endl;
//		cout<<tree[k].sum<<"e\n";
		return tree[k].sum;
	}
	PushDown(k);
	return Query((k<<1),l,r)+Query((k<<1|1),l,r);
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	BuildTree(1,1,n);
//	cout<<tree[9].l<<" "<<tree[9].r<<" "<<tree[9].sum<<"\n";
	for(int i=1;i<=m;i++){
		int op,x,y,k;
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			Add(1,x,y,k);
		}
		else{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",Query(1,x,y));
//			for(int i=1;i<=n;i++)cout<<Query(1,i,i)<<"e";
		}
	}
	return 0;
}

2021/11/28 15:38
加载中...