分块0pts求调
查看原帖
分块0pts求调
540757
wangyihao0411楼主2024/10/24 11:05
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m,bn,bl;
int a[N],l[N],r[N],sum[N],put[N],w[N];
signed main(){
	scanf("%lld%lld",&n,&m);
	bl=sqrt(n);
	bn=n/bl;
	for(int i=1;i<=n;i++)
	{
		cin >> a[i];
	}
   	for(int i=1;i<=bn;i++)
	{
		l[i]=(i-1)*bl+1;
		r[i]=i*bl;
		//cout << l[i] << " " << r[i] << endl;
	}
	for(int i=1;i<=r[bn];i++)
	{
		w[i]=(i-1)/bl+1;
		//cout << w[i] << " ";
		sum[(i-1)/bl+1]+=a[i];
	}
	if(bl*bn<n)
	{
		bn++;
		l[bn]=(bn-1)*bl+1;
		r[bn]=n;
		//cout << l[bn] << " " << r[bn] << endl;
		for(int i=l[bn];i<=n;i++)
		{
			w[i]=(i-1)/bl+1;
			//cout << w[i] << " ";
			sum[(i-1)/bl+1]+=a[i];
		}
	}
	//cout << bn << " " << bl << endl;
	for(int i=1;i<=m;i++)
	{
		int wh;
		scanf("%lld",&wh);
		if(wh==1)
		{
			int ll,rr,k;
			scanf("%lld%lld%lld",&ll,&rr,&k);
			for(int j=ll;j<l[w[ll]];j++)
			{
				a[j]+=k;
				sum[w[j]]+=k;
			}
			int kc=0,lc=0;
			if(r[w[rr]]==rr)
			{
				kc++;
			}
			if(l[w[ll]]==ll)
			{
				lc++;
			}
			for(int j=w[ll]+1-lc;j<w[rr]+kc;j++)
			{
				put[j]+=k;
				sum[j]+=k*(r[j]-l[j]+1);
			}
			if(kc==0)
			{
				for(int j=l[w[rr]];j<=rr;j++)
				{
					a[j]+=k;
					sum[w[j]]+=k;
				}
			}
			/*for(int j=ll;j<=rr;j++)
			{
				cout << a[j] << ";" << put[w[j]] << ";" << sum[w[j]] << " ";
			}
			cout << endl;*/
		}
		if(wh==2||wh==3)
		{
			int k;
			scanf("%lld",&k);
			if(wh==2)
			{
				a[1]+=k;
				sum[1]+=k;
			}
			else
			{
				a[1]-=k;
				sum[1]-=k;
			}
		}	
		if(wh==4)
		{
			int ll,rr,ans=0;
			scanf("%lld%lld",&ll,&rr);
			for(int j=ll;j<l[w[ll]];j++)
			{
				ans=ans+a[j]+put[w[j]];
			}
			int kc=0,lc=0;
			if(l[w[ll]]==ll)
			{
				lc++;
			}
			if(r[w[rr]]==rr)
			{
				kc=1;
			}
			for(int j=w[ll]+1-lc;j<w[rr]+kc;j++)
			{
				ans+=sum[j];
			}
			if(kc==0)
			{
				for(int j=l[w[rr]];j<=rr;j++)
				{
					ans=ans+a[j]+put[w[j]];
					//cout << put[w[j]] << endl;
				}
			}
			/*for(int j=ll;j<=rr;j++)
			{
				cout << a[j] << ";" << put[w[j]] << ";" << sum[w[j]] << " ";
			}
			cout << endl;*/
			printf("%lld\n",ans);
		}
		if(wh==5)
		{
			printf("%lld\n",a[1]+put[1]);	
		}
	}
    return 0;
}
2024/10/24 11:05
加载中...