分块过线段树
查看原帖
分块过线段树
1234924
lsd110504lsd楼主2025/1/27 14:43
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
const int N=1e6+10;
int tag[N],tl[N],tr[N],a[N],B,shit[N];
int /*q[N]*/C[N];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
inline void build()
{
	int B=sqrt(n);
	for(int k=1;k<=(n%B==0?n/B:n/B+1);k++)
	{
		for(int i=(k-1)*B+1;i<=min(k*B,n);i++)
		{
			tag[i]=k;
			tl[i]=(k-1)*B+1;
			tr[i]=min(k*B,n);
		}
	}
	return ;
}

inline void add_on(int x,int y,int k){
	int B=sqrt(n);
	if(tag[x]==tag[y]){
		for(int i=x;i<=y;i++)
		{
			a[i]+=k;
		}
		C[tag[x]]+=(y-x+1)*k;
		return ;
	}
	else{
		for(int i=tag[x]+1;i<=tag[y]-1;i++)
		{
			C[i]+=B*k;
			shit[i]+=k;
		}
		for(int i=x;i<=tr[x];i++ )
		{
			a[i]+=k;
		}
		C[tag[x]]+=(tr[x]-x+1)*k;
		for(int i=tl[y];i<=y;i++)
		{
			a[i]+=k;
		}
		C[tag[y]]+=(y-tl[y]+1)*k;
		return ;
	} 
	return ;
}
inline void ques(int x,int y)
{
	int ans=0;
	if(tag[x]==tag[y])
	{
		for(int i=x;i<=y;i++)
		{
			ans+=a[i]+shit[tag[i]];
		}
		cout<<ans<<endl;
		return ;
	}
	else{
//		for(int i=x;i<=y;i++)
//		{
//			ans+=a[i]+C[tag[i]];
//		}
		for(int i=x;i<=tr[x];i++)
		{
			ans+=a[i]+shit[tag[x]]/*+C[tag[x]]-q[tag[x]]*/;
		}
		for(int i=tl[y];i<=y;i++)
		{
			ans+=a[i]+shit[tag[y]]/*+C[tag[y]]-q[tag[y]]*/;
		}
		for(int i=tag[x]+1;i<=tag[y]-1;i++)
		{
			ans+=C[i];
		}
		cout<<ans<<endl;
	}
	return ;
}
signed main()
{
	n=read(),m=read();
	int B=sqrt(n);
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build();
	for(int i=1;i<=(n%B==0?n/B:n/B+1);i++)
	{
		for(int j=(i-1)*B+1;j<=min(i*B,n);j++)
			C[i]+=a[j]/*,q[i]=C[i]*/;
	}
	for(int i=1;i<=m;i++){
		int k=read();
		if(k==1)
		{
			int x=read(),y=read(),t=read();
			add_on(x,y,t);
		}
		else 
		{
			int x=read(),y=read();
			ques(x,y);
		}
	}
	return 0;
}
2025/1/27 14:43
加载中...