0分求调
查看原帖
0分求调
765280
Huyh12楼主2025/7/22 16:31
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005];
struct node{
	long long sum,l,r,lazy;
}tree[400005];
void build(int id,int l,int r)
{
	tree[id].l=l;
	tree[id].r=r;
	if(l==r)
	{
		tree[id].sum=a[l];
		return ;
	}
	build(id*2,l,(l+r)/2);
	build(id*2+1,(l+r)/2+1,r);
	tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
void pushdown(int id)
{
	int k=tree[id].lazy;
	tree[id*2].sum+=(tree[id*2].r-tree[id*2].l+1)*k;
	tree[id*2+1].sum+=(tree[id*2+1].r-tree[id*2+1].l+1)*k;
	tree[id*2].lazy=k,tree[id*2+1].lazy=k;
	tree[id].lazy=0;
}
long long search(long long id,long long l,long long r)
{
	if(l<=tree[id].l&&r>=tree[id].r)
		return tree[id].sum;
	if(tree[id].r<l||tree[id].l>r)
		return 0;
	long long cnt=0;
	pushdown(id);
	if(tree[id*2].r>=l)
		cnt+=search(id*2,l,r);
	if(tree[id*2+1].l<=r)
		cnt+=search(id*2+1,l,r);
	return cnt;
}
void add(long long id,long long l,long long r,long long k)
{
	if(l<=tree[id].l&&r>=tree[id].r)
	{
		tree[id].sum+=(tree[id].r-tree[id].l+1)*k;
		tree[id].lazy+=k;
		return ;
	}
	pushdown(id);
	if(tree[id*2].r>=l)
		add(id*2,l,r,k);
	if(tree[id*2+1].l<=r)
		add(id*2+1,l,r,k);
	tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
int main()
{
	cin>>n>>m;
	for(long long i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(m--)
	{
		long long pd,x,y;
		cin>>pd>>x>>y;
		if(pd-1){//查询
			cout<<search(1,x,y)<<endl;
		}
		else
		{
			long long k;
			cin>>k;
			add(1,x,y,k);
		}
	}
	return 0;
}
2025/7/22 16:31
加载中...