线段树七红三紫求调
查看原帖
线段树七红三紫求调
444485
风雪夜归人_楼主2022/7/16 20:51

RT

#include<iostream>
using namespace std;
int n,m,a[1000009],op,x,y,k;
struct tree
{
	int l,r;
	int sum,num;
}t[4000009];
void update(int x)
{
	t[x].sum=t[x<<2].sum+t[x<<2|1].sum;
}
void down(int x)
{
	t[x<<2].num+=t[x].num;
	t[x<<2|1].num+=t[x].num;
	t[x<<2].sum+=t[x].num*(t[x<<2].r-t[x<<2].l+1);
	t[x<<2|1].sum+=t[x].num*(t[x<<2|1].r-t[x<<2|1].l+1);
	t[x].num=0;
}
void build(int x,int l,int r)
{
	t[x].l=l;
	t[x].r=r;
	if (l==r)
	{
		t[x].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(x<<2,l,mid);
	build(x<<2|1,mid+1,r);
	update(x);
}
void insert(int x,int l,int r,int k)
{
	if (t[x].l>r||t[x].r<l)return;
	if (t[x].l>=l&&t[x].r<=r)
	{
		t[x].num+=k;
		t[x].sum+=(t[x].r-t[x].l+1)*k;
		return;
	}
	down(x);
	insert(x<<2,l,r,k);
	insert(x<<2|1,l,r,k);
//	update(x);
//	down(x);
	t[x].sum=t[x<<2].sum+t[x<<2|1].sum;
/*	t[x].sum+=(t[x].r-t[x].l+1)*t[x].num;*/
	
}
int find(int x,int l,int r)
{
	if (t[x].l>r||t[x].r<l)return 0;
	if (t[x].l>=l||t[x].r<=r)
	{
		return t[x].sum;
	}
	down(x);
	return find(x<<2,l,r)+find(x<<2|1,l,r);
}
int main()
{
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for (int i=1;i<=m;i++)
	{
		cin>>op;
		
		if (op==1)
		{
			cin>>x>>y>>k;
			insert(1,x,y,k);
		}
		if (op==2)
		{
			cin>>x>>y;
			cout<<find(1,x,y)<<endl;
		}
	}
	return 0;
}
2022/7/16 20:51
加载中...