分块求调
查看原帖
分块求调
178992
Hanghang楼主2021/10/18 22:34
#include<bits/stdc++.h>
using namespace std;

const int N=100003;
long long n,m,a[N],l[N],r[N],p[N],tag[N],sum[N];
void B()
{
	int k=sqrt(n),t=n/k;if(n%k==0)t++;
	for(int i=1;i<=t;i++)l[i]=(i-1)*k+1,r[i]=i*k;
	r[t]=n;
	for(int i=1;i<=n;i++)p[i]=(i-1)/k+1;
}
void U(long long L,long long R,long long d)
{
	long long x=p[L],y=p[R];
	if(x==y)
	{
		for(int i=L;i<=R;i++)a[i]+=d;
		sum[x]+=d*(R-L+1);
	}
	else
	{
		for(int i=x+1;i<y;i++)tag[i]+=d;
		for(int i=L;i<=r[x];i++)a[i]+=d;
		sum[x]+=d*(r[x]-L+1);
		for(int i=l[y];i<=R;i++)a[i]+=d;
		sum[y]+=d*(R-l[y]+1);
	}
}
long long Q(long long L,long long R)
{
	long long x=p[L],y=p[R],s=0;
	if(x==y)
	{
		for(int i=L;i<=R;i++)s+=a[i];
		s+=tag[x]*(R-L+1);tag[x]=0;
	}
	else
	{
		for(int i=x+1;i<y;i++)s+=sum[i]+tag[i]*(r[i]-l[i]+1);
		for(int i=L;i<=r[x];i++)s+=a[i];
		s+=tag[x]*(r[x]-L+1);
		for(int i=l[y];i<=R;i++)s+=a[i];
		s+=tag[y]*(R-l[y]+1);
		tag[x]=0;tag[y]=0;
	}
	return s;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	B();
	for(int i=1;i<=m;i++)
	{
		long long q,l,r,d;cin>>q>>l>>r;
		if(q==1)cin>>d,U(l,r,d);
		else cout<<Q(l,r)<<endl;
	}
	return 0;
}
2021/10/18 22:34
加载中...