7/10段树求调
查看原帖
7/10段树求调
942399
Kiw_楼主2024/7/20 07:09

70分WA

#include<bits/stdc++.h>
using namespace std;
long long a[100005],d[400005],b[400005],n,m,ques,x,y,k;
void build(long long s,long long t,long long p)
{
	if(s==t)
	{
		d[p]=a[s];
		return;
	}
	long long m=s+((t-s)>>1);
	build(s,m,p<<1);
	build(m+1,t,(p<<1)+1);
	d[p]=d[p<<1]+d[(p<<1)+1];
	return;
}
void update(long long l,long long r,long long c,long long s,long long t,long long p)
{
	if(l<=s&&r>=t)
	{
		b[p]+=c;
		d[p]+=c*(t-s+1);
		return;
	}
	long long m=s+((t-s)>>1);
	if(b[p]&&s!=t)
	{
		b[p<<1]+=b[p];
		b[(p<<1)+1]+=b[p];
		d[p<<1]+=b[p]*(m-s+1);
		d[(p<<1)+1]+=b[p]*(t-m);
		b[p]=0;
	}
	if(l<=m)
	{
		update(l,r,c,s,m,(p<<1));
	}
	if(r>m)
	{
		update(l,r,c,m+1,t,(p<<1)+1);
	}
	d[p]=d[p<<1]+d[(p<<1)+1];
}
int getsum(long long l,long long r,long long s,long long t,long long p)
{
	if(l<=s&&r>=t)
	{
		return d[p];
	}
	long long m=s+((t-s)>>1);
	if(b[p])
	{
		d[p<<1]+=b[p]*(m-s+1);
		d[(p<<1)+1]+=b[p]*(t-m);
		b[p<<1]+=b[p];
		b[(p<<1)+1]+=b[p];
		b[p]=0;
	}
	long long sum=0;
	if(l<=m)
		sum+=getsum(l,r,s,m,p*2);
	if(r>m)
		sum+=getsum(l,r,m+1,t,p*2+1);
	return sum;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	for(long long i=1;i<=m;i++)
	{
		scanf("%lld%lld%lld",&ques,&x,&y);
		if(ques==1)
		{
			scanf("%lld",&k);
			update(x,y,k,1,n,1);
		}
		if(ques==2)
		{
			printf("%lld\n",getsum(x,y,1,n,1));
		}
	}
	return 0;
}
2024/7/20 07:09
加载中...