分块20pts求助
查看原帖
分块20pts求助
264463
添哥楼主2022/3/26 13:30
#include<iostream>
#include<math.h>
using namespace std;
long long n,m,t,len;
long long a[100005],l[320],r[320],sum[320],lazy[320],pos[100005];
int main()
{
	cin>>n>>m;
	for(long long i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	len=sqrt(n);
	t=n/len;
	if(n%len!=0)
	{
		t++;
	}
	for(long long i=1;i<=t;i++)
	{
		l[i]=(i-1)*len+1;
		r[i]=i*len;
	}
	if(r[t]>n)
	{
		r[t]=n;
	}
	for(long long i=1;i<=t;i++)
	{
		for(long long j=l[i];j<=r[i];j++)
		{
			pos[j]=i;
			sum[i]+=a[j];
		}
	}
	while(m--)
	{
		long long opt,x,y,k;
		cin>>opt>>x>>y;
		if(opt==1)
		{
			cin>>k;
			if(pos[x]==pos[y])
			{
				for(long long i=x;i<=y;i++)
				{
					a[i]+=k;
					sum[pos[i]]+=k;
				}
			}
			else
			{
				for(long long i=x;i<=r[pos[x]];i++)
				{
					a[i]+=k;
					sum[pos[i]]+=k;
				}
				for(long long i=pos[x]+1;i<=pos[y]-1;i++)
				{
					lazy[i]+=k;
				}
				for(long long i=l[pos[y]];i<=y;i++)
				{
					a[i]+=k;
					sum[pos[i]]+=k;
				}
			}
		}
		else
		{
			long long s=0;
			if(pos[x]==pos[y])
			{
				for(long long i=x;i<=y;i++)
				{
					s+=a[i];
				}
			}
			else
			{
				for(long long i=x;i<=r[pos[x]];i++)
				{
					s+=a[i]+lazy[pos[i]];
				}
				for(long long i=pos[x]+1;i<=pos[y]-1;i++)
				{
					s+=sum[i]+lazy[i];
				}
				for(long long i=l[pos[y]];i<=y;i++)
				{
					s+=a[i]+lazy[pos[i]];
				}
			}
			cout<<s<<endl;
		}
	}
}
2022/3/26 13:30
加载中...