蒟蒻代码求调
查看原帖
蒟蒻代码求调
475888
lincong楼主2022/5/17 20:07
#include<iostream>
const int N=1e5+10;
int n,m,a[N],t,d[N],x,y,k,b[N];
using namespace std;
int sum;
void build(int start,int end,int number)
{
	if(start==end)
	{
		d[number]=a[start];
		return;
	}
	int mid=start+((end-start)>>1);
	build(start,mid,number*2);
	build(mid+1,end,number*2|1);
	d[number]=d[number*2]+d[number*2|1];
}
int getsum(int left,int right,int start,int end,int p)
{
	if(left<=start&&right>=end)
	{
		return d[p];
	}
	int mid=start+((end-start)>>1),sum=0;
	if(b[p])
	{
		d[p<<1]+=(mid-start)*b[p];
		d[(p<<1)|1]+=(mid-start+1)*b[p];
		b[p<<1]+=b[p];
		b[(p<<1)|1]+=b[p];
	}
	b[p]=0;
	sum=0;
	if(left<=mid)
	{
		sum+=getsum(left,right,start,mid,p*2);
	}
	if(right>mid)
	{
		sum+=getsum(left,right,mid+1,end,(p<<1)|1);
	}
	return sum;
}
void update(int left,int right,int value,int start,int end,int p)
{
	if(left<=start&&end<=right)
	{
		d[p]+=(end-start+1)*value;
		b[p]+=value;
		return;
	}
	int mid=start+((end-start)>>1);
	if(b[p])
	{
		d[p<<1]+=(mid-start+1)*b[p];
		d[(p<<1)|1]+=(end-mid)*b[p];
		b[p<<1]+=b[p];
		b[(p<<1)|1]+=b[p];
	}
	b[p]=0;
	if(left<=mid)
	{
		update(left,right,value,start,mid,p<<1);
	}
	if(right>mid)
	{
		update(left,right,value,mid+1,end,(p<<1)|1);
	}
	d[p]=d[(p<<1)|1]+d[(p<<1)|1];
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,n,1);
	while(m--)
	{
		cin>>t;
		if(t==1)
		{
			cin>>x>>y>>k;
			update(x,y,k,1,n,1);
		}
		if(t==2)
		{
			cin>>x>>y;
			cout<<getsum(x,y,1,n,1)<<endl;
		}
	}
	return 0;
} 
2022/5/17 20:07
加载中...