线段树萌新代码求调
查看原帖
线段树萌新代码求调
1075700
jxjxmmm楼主2024/3/12 20:34
#include<bits/stdc++.h>
using namespace std;
int m,n,a[100001];
long long f[400001],v[400001],ans;
void build(int u,int l,int r)
{
	v[u]=0;
	if(l==r)
	{
		f[u]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(2*u,l,mid);
	build(2*u+1,mid+1,r);
	f[u]=f[2*u]+f[2*u+1];
}
void add(int u,int l,int r,int x,int y,long long int k)
{
	if(l==x&&r==y)
	{
		v[u]+=k;
		return;
	}
	int mid=(l+r)>>1;
	f[u]+=(y-x+1)*k;
	if(mid>=y)
	{
		add(2*u,l,mid,x,y,k);
	}
	else
		if(mid<x)
		{
			add(2*u+1,mid+1,r,x,y,k);
		}
		else
		{
			add(2*u,l,mid,x,mid,k);
			add(2*u+1,mid+1,r,mid+1,y,k);
		}
}
long long ask(int u,int l,int r,int x,int y,long long p)
{
	p+=v[u];
	if(l==x && r==y)
	{
		return p*(r-l+1)+f[u];
	}
	int mid=(l+r)>>1;
	if(y<=mid)
	{
		return ask(2*u,l,mid,x,y,p);
	}
	else
		if(mid<=x)
		return ask(2*u+1,mid+1,r,x,y,p);
		else
		{
			return ask(2*u+1,mid+1,r,mid+1,y,p)+ask(2*u,l,mid,x,mid,p);
		}
}
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++)
	{
		int t;
		cin>>t;
		if(t==1)
		{
			int x,y;
			long long k;
			cin>>x>>y>>k;
			add(1,1,n,x,y,k);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			cout<<ask(1,1,n,x,y,0)<<'\n';
		}
	}
}
2024/3/12 20:34
加载中...