10分。。手搓数据测着没问题。。。
查看原帖
10分。。手搓数据测着没问题。。。
1420936
Sparkle_ovo楼主2024/8/14 09:09
#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;
const int N=10010;
#define LL long long
#define itn int
LL n,m;
LL a[N],tree[N*60],lazy[N*60];
void push(int pos,int l,int r) {
	int son=(pos<<1),len=r-l+1;
	lazy[son]+=lazy[pos];
	lazy[son+1]+=lazy[pos];
	tree[pos]+=lazy[pos]*len;
	lazy[pos]=0;
	return;
}
void add(int pos,int l,int r,int val,int vl,int vr) {
	if(l==r) {
		tree[pos]+=val;
		return;
	}
	if(vl<=l&&vr>=r) {
		lazy[pos]+=val;
		return;
	}
	int mid=(l+r)>>1,son=pos<<1;
	if(vl<=mid)
		add(son,l,mid,val,vl,vr);
	if(vr>mid)
		add(son+1,mid+1,r,val,vl,vr);
	tree[pos]=tree[son]+tree[son+1];
	return;
}
LL ask(int pos,int l,int r,int al,int ar) {
	int mid=(l+r)>>1,son=pos<<1;
	if(l==r) {
		return tree[pos]+lazy[pos]*(r-l+1);
	}
	if(al<=l&&r<=ar) {
		return tree[pos]+lazy[pos]*(r-l+1);
	}
	push(pos,l,r);
	LL ans=0;
	if(al<=mid) ans+=ask(son,l,mid,al,ar);
	if(ar>mid) ans+=ask(son+1,mid+1,r,al,ar);
//	tree[pos]=tree[son]+tree[son+1];
	return ans;
}
void build(int pos,int l,int r) {
	if(l==r) {
		tree[pos]=a[l];
		return;
	}
	int mid=(l+r)>>1,son=pos<<1;
	build(son,l,mid);
	build(son+1,mid+1,r);
	tree[pos]=tree[son]+tree[son+1];
	return ;
}
int main() {
	memset(tree,0,sizeof(tree));
	memset(lazy,0,sizeof(lazy));
	cin>>n>>m;
	for(int i=1; i<=n; i++) {
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	LL opt,x,y,k;
	for(int i=1; i<=m; i++) {
		scanf("%lld",&opt);
		if(opt==1) {
//			scanf("%lld %lld %lld",&x,&y,&k);
			cin>>x>>y>>k;
			add(1,1,n,k,x,y);
		}
		if(opt==2) {
//			scanf("%lld %lld",&x,&y);
			cin>>x>>y;
			cout<<ask(1,1,n,x,y)<<endl;
		}
	}
//	system("pause");
	return 0;
}
2024/8/14 09:09
加载中...