#为啥全RE啊!!!!
  • 板块P2357 守墓人
  • 楼主十柒
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/12/16 21:16
  • 上次更新2023/11/5 06:02:59
查看原帖
#为啥全RE啊!!!!
227423
十柒楼主2020/12/16 21:16
#include<bits/stdc++.h>

#define ll long long

using namespace std;

ll n,m;

ll A[50000000];

ll sump[50000000];

ll len[50000000];

ll lazy[50000000];

void pushup(ll k)
{
	sump[k]=sump[k<<1]+sump[k<<1|1];
	
	len[k]=len[k<<1]+len[k<<1|1];
}
void build(ll k,ll l,ll r)
{
	
	if(l==r)
	{
		sump[k]=A[l];
		len[k]=1;
		return ;
	}
	ll mid=(l+r)/2;
		
	build(k<<1,l,mid);
	
	build(k<<1|1,mid+1,r);
	
	pushup(k);
}

void  As(ll k,ll x)
{
	
	sump[k]+=x*len[k];
	
	lazy[k]+=x;

}

void pushdown(ll k)
{
	
	if(lazy[k])
	{
		As(k<<1,lazy[k]);
		As(k<<1|1,lazy[k]);
		lazy[k]=0;
	}	

	
}

void change(ll k,ll l,ll r,ll q,ll w,ll T)
{
	
	if(l>w||r<q)
	{
		return ;
	}
	if(l==q&&r==w)
	{
		As(k,T);
		return ;
	}
	
	pushdown(k);
	
	ll mid=(l+r)/2;
	change(k<<1,l,mid,q,w,T);
	
	change(k<<1|1,mid+1,r,q,w,T);
	
	pushup(k);
}

ll find(ll k,ll l,ll r,ll q,ll w)

{
	
	if(l>w||r<q)
	{
		return 0;
	}
	
	if(l==q&&r==w)
	{
		return sump[k];
	}
	
	pushdown(k);
	ll mid=(r+l)/2;
	return 
    find(k<<1,l,mid,q,w)+find(k<<1|1,mid+1,r,q,w);
	
}

int main()
{

	cin>>n>>m;
    
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&A[i]);
	}
	
	build(1,1,n);
	while(m--)
	{
		int p;
		scanf("%d",&p);
		
		if(p==1)//qu jian jia 
		{
			int l,r,T;
			cin>>l>>r>>T;
			change(1,1,n,l,r,T);
		}
		else if(p==2) // zhu mu jia 
		{
			int T;
			cin>>T;
			change(1,1,n,1,1,T);
		}
		else if(p==3)// zhu mu jian;
		{
			int T;
			cin>>T;
			change(1,1,n,1,1,-T);
		}
		else if(p==4)
		{
			int l,r;
			cin>>l>>r;
			cout<<find(1,1,n,l,r)<<endl;
		}
		else
		{
			cout<<find(1,1,n,1,1)<<endl;
		}
		
	}
	return 0;
}
2020/12/16 21:16
加载中...