样例过,15分求条
查看原帖
样例过,15分求条
714844
jinyixuan楼主2025/7/2 10:51
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct tree{
	int l,r,w,lazy;	
};
int n,m;
vector<int>a;
vector<tree>tr;
void update(int k)
{
	tr[k].w=tr[k*2].w+tr[k*2+1].w;
}
void push_down(int k)
{
	if(tr[k].l==tr[k].r)
	{
		tr[k].lazy=0;
		return;
	}
	tr[k*2].w+= (tr[k*2].r-tr[k*2].l+1)*tr[k].lazy;
	tr[k*2+1].w+= (tr[k*2+1].r-tr[k*2+1].l+1)*tr[k].lazy;
	
	tr[k*2].lazy+=tr[k].lazy;
	tr[k*2+1].lazy+=tr[k].lazy;
	tr[k].lazy=0;
}
void build(int p,int x,int y)
{
	tr[p].l=x;
	tr[p].r=y;
	if(x==y)
	{
		tr[p].w=a[x];
		return ;
	}
	int mid=(x+y)/2;
	build(p*2,x,mid);
	build(p*2+1,mid+1,y);
	update(p);
}
void change(int p,int x,int y,int z)
{
	if(tr[p].l==x &&tr[p].r==y)
	{
		tr[p].w+=(y-x+1)*z;
		tr[p].lazy+=z;
		return ;
	}
	int mid=(tr[p].l+tr[p].r)/2;
	if(y<=mid)
	{
		change(p*2,x,y,z);
	}
	else if(x>mid)
	{
		change(p*2+1,x,y,z);
	}
	else{
		change(p*2,x,mid,z);
		change(p*2+1,mid+1,y,z);
	}
	update(p);
}
int quary(int p,int x,int y)
{
	if(tr[p].lazy)push_down(p);
	if(tr[p].l==x &&tr[p].r==y)
	{
		return tr[p].w;
	}
	int mid=(tr[p].l+tr[p].r)/2;
	if(mid>=y)
	{
		return quary(p*2,x,y);
	}
	else if(mid<x)
	{
		return quary(p*2+1,x,y);
	}
	return quary(p*2,x,mid)+quary(p*2+1,mid+1,y);
	
}
signed main()
{
	cin>>n>>m;
	a.resize(n+1);
	tr.resize(n*4+5);
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=0;i<m;i++)
	{
		int a,x,y,k;
		cin>>a>>x>>y;
		if(a==1)
		{
			cin>>k;
			change(1,x,y,k);
		}
		else{
			cout<<quary(1,x,y)<<endl;
		}
	}
}
2025/7/2 10:51
加载中...