WA了最后三点,求助
查看原帖
WA了最后三点,求助
239428
twz050412楼主2021/4/4 16:31
#include<bits/stdc++.h>
using namespace std;
int a[100005],n,m,k;long long ans;
struct tree
{
	int l,r,data,add;
}t[400010];
void build(int l,int r,int p)
{
	t[p].l=l;t[p].r=r;
	if(l==r){t[p].data=a[l];return;}
	int mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	t[p].data=t[p*2].data+t[p*2+1].data;
	return;
}
void sp(int p)
{
	if(t[p].add)
	{
		t[p*2].data+=t[p].add*(t[p*2].r-t[p*2].l+1);
		t[p*2+1].data+=t[p].add*(t[p*2+1].r-t[p*2+1].l+1);
		t[p*2].add+=t[p].add;t[p*2+1].add+=t[p].add;
		t[p].add=0;
	}
}
void add(int l,int r,int p)
{
	if(l<=t[p].l&&r>=t[p].r){
		t[p].data+=k*(t[p].r-t[p].l+1);
		t[p].add+=k;
		return;
	} 
	int mid=(t[p].l+t[p].r)/2;
	sp(p);
	if(mid>=l)add(l,r,p*2);
	if(r>mid)add(l,r,p*2+1);
	t[p].data=t[p*2].data+t[p*2+1].data; 
}
void ask(int l,int r,int p)
{
	if(l<=t[p].l&&r>=t[p].r){
		ans+=t[p].data;return;
	}
	sp(p);
	int mid=(t[p].l+t[p].r)/2;
	if(mid>=l)ask(l,r,p*2);
	if(r>mid)ask(l,r,p*2+1);
	t[p].data=t[p*2].data+t[p*2+1].data; 
	return;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
 	build(1,n,1);
	int li,x,y;
	while(m--)
	{
		li=x=y=k=0;
		cin>>li;
		if(li==1)
		{
			cin>>x>>y>>k;
			add(x,y,1);
		}else
		{
			cin>>x>>y;
			ans=0;
			ask(x,y,1);
			cout<<ans<<endl;
		}
	}
	return 0;
}
2021/4/4 16:31
加载中...