70pts求调
查看原帖
70pts求调
1305985
Gordon1楼主2024/12/21 11:53
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[400005];
struct Node
{
	int l,r,num,lz;
}tree[400005];
void build(int l,int r,int index)
{
	tree[index].l=l;
	tree[index].r=r;
	tree[index].lz=0;
	if(l==r)
	{
		tree[index].num=a[l];
		return ;
	}
	int mid=l+(r-l)/2;
	build(l,mid,index*2);
	build(mid+1,r,index*2+1);
	tree[index].num=tree[index*2].num+tree[index*2+1].num;
	return ;
}
void pushdown(int index)
{
	if(tree[index].lz!=0)
	{
		tree[2*index].lz+=tree[index].lz;
		tree[2*index+1].lz+=tree[index].lz;
		int mid=(tree[index].l+tree[index].r)/2;
		tree[2*index].num+=tree[index].lz*(mid-tree[2*index].l+1);
		tree[2*index+1].num+=tree[index].lz*(tree[2*index+1].r-mid);
		tree[index].lz=0;
	}
	return ;
}
void add(int index,int l,int r,int k)
{
	if(tree[index].l>=l&&tree[index].r<=r)
	{
		tree[index].num+=k*(tree[index].r-tree[index].l+1);
		tree[index].lz+=k;
		return ;
	}
	pushdown(index);
	if(tree[index*2].r>=l)
		add(2*index,l,r,k);
	if(tree[index*2+1].l<=r)
		add(2*index+1,l,r,k);
	tree[index].num=tree[2*index].num+tree[2*index+1].num;
	return ;
}
int search(int index,int l,int r)
{
	if(tree[index].l>=l&&tree[index].r<=r)
	{
		return tree[index].num;
	}
	pushdown(index);
	int num=0;
	if(tree[index*2].r>=l)
		num+=search(2*index,l,r);
	if(tree[index*2+1].l<=r)
		num+=search(2*index+1,l,r);
		return num;
}
int op,x,y,z;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i)
	{
		cin>>a[i];
	}
	build(1,n,1);
	for(int i=1;i<=m;++i)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>z;
			add(1,x,y,z);
		}
		else
		{
			cin>>x>>y;
			cout<<search(1,x,y)<<endl;
		}
	}
	return 0;
}

#8,9,10 WA,求调

2024/12/21 11:53
加载中...