萌新线段树暴零,样例最后一个过不去
查看原帖
萌新线段树暴零,样例最后一个过不去
342090
Lips楼主2020/6/18 17:38

求助!

#include<cstdio>
using namespace std;
typedef long long ll;
const int MAXN=100010;
ll n,m,ans,tot=1,a[MAXN];
struct node
{
	ll ls,rs,sum,tag;
};
node tree[MAXN*2];
void push_up(ll u)
{
	tree[u].sum=tree[tree[u].ls].sum+tree[tree[u].rs].sum;
}
void push_down(ll u,ll l,ll r)
{
	ll mid=(l+r)>>1;
	tree[tree[u].ls].sum+=(mid-l+1)*tree[u].tag;
	tree[tree[u].ls].tag+=tree[u].tag;
	tree[tree[u].rs].sum+=(r-mid)*tree[u].tag;
	tree[tree[u].rs].tag+=tree[u].tag;
	tree[u].tag=0;
}
void update(ll u,ll l,ll r,ll ln,ll rn,ll k)
{
	if(l==ln&&r==rn)
	{
		tree[u].sum+=(r-l+1)*k;
		tree[u].tag+=k;
		return;
	}
	push_down(u,l,r);
	ll mid=(l+r)>>1;
	if(rn<=mid) update(tree[u].ls,l,mid,ln,rn,k);
	else if(ln>mid) update(tree[u].rs,mid+1,r,ln,rn,k);
	else
	{
		update(tree[u].ls,l,mid,ln,mid,k);
		update(tree[u].rs,mid+1,r,mid+1,rn,k);
	}
	push_up(u);
}
void build(ll u,ll l,ll r)
{
	if(l==r)
	{
		tree[u].sum+=a[l];
		return;
	}
	ll mid=(l+r)>>1;
    tree[u].ls=++tot;
    build(tree[u].ls,l,mid);
    tree[u].rs=++tot;
    build(tree[u].rs,mid+1,r);
    push_up(u);
}
void query(ll u,ll l,ll r,ll ln,ll rn)
{
	if(l==ln&&r==rn)
	{
		ans+=tree[u].sum;
		return;
	}
	ll mid=(l+r)>>1;
	if(rn<=mid) query(tree[u].ls,l,mid,ln,rn);
	else if(ln>mid) query(tree[u].rs,mid+1,r,ln,rn);
	else
	{
		query(tree[u].ls,l,mid,ln,mid);
		query(tree[u].rs,mid+1,r,mid+1,rn);
	}
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(register ll i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--)
	{
		ll opt,x,y;
		scanf("%lld%lld%lld",&opt,&x,&y);
		if(opt==1)
		{
			ll k;
			scanf("%lld",&k);
			update(1,1,n,x,y,k);
		}
		else
		{
			ans=0;
			query(1,1,n,x,y);
			printf("%lld\n",ans);
			ans=0;
		}
	 } 
}
2020/6/18 17:38
加载中...