0分求调!
查看原帖
0分求调!
1425651
liuyiming2024123456楼主2025/2/8 15:06
#include<bits/stdc++.h>
using namespace std;
long long n,q,m,siz,tot;
long long bel[100005],sum[400],L[400],R[400],add[400],add1[400],a[100005];
void init()
{
        siz=sqrt(n);
	tot=n/siz;
	if (n%siz) tot++;
	for (int i=1;i<=400;i++) add1[i]=1;
	for (int i=1;i<=tot;i++) L[i]=siz*(i-1)+1,R[i]=min(siz*i,n);
	for (int i=1;i<=n;i++) bel[i]=(i-1)/siz+1;
	for (int i=1;i<=n;i++) sum[bel[i]]+=a[i];
}
void update1(long long l,long long r,long long k)
{
	long long x=bel[l],y=bel[r];
	if (x==y)
	{
		for (int i=l;i<=r;i++) a[i]+=k,sum[x]+=k;
	}
 	else
	{
		for (int i=l;i<=R[x];i++) a[i]+=k,sum[x]+=k;
		for (int i=L[y];i<=r;i++) a[i]+=k,sum[y]+=k;
		for (int i=x+1;i<=y-1;i++) add[i]+=k,sum[i]+=k*siz;
	}
	return;
}
void update11(long long l,long long r,long long k)
{
	long long x=bel[l],y=bel[r];
	long long ji=k-1;
	if (x==y)
	{
		for (int i=l;i<=r;i++) a[i]*=k,sum[x]+=a[i]*ji;
	}
	else
	{
		for (int i=l;i<=R[x];i++) a[i]*=k,sum[x]+=a[i]*ji;
		for (int i=L[y];i<=r;i++) a[i]*=k,sum[y]+=a[i]*ji;
		for (int i=x+1;i<=y;i++) add[i]*=k,sum[i]*=k,add1[i]=k*add1[i];
	}
	return;
}
long long update0(long long l,long long r)
{
	long long ans=0;
	long long x=bel[l],y=bel[r];
	if (x==y)
	{
		for (int i=l;i<=r;i++) ans+=a[i]*add1[x]+add[x];
	}
	else
	{
		for (int i=L[y];i<=r;i++) ans+=a[i]*add1[y]+add[y];
		for (int i=l;i<=R[x];i++) ans+=a[i]*add1[x]+add[x];
		for (int i=x+1;i<=y-1;i++) ans+=sum[i];
	}
	return ans;
}
int main()
{
	cin>>n>>q>>m;
	for (int i=1;i<=n;i++) cin>>a[i];
	init();
	for (int i=1;i<=q;i++)
	{
		long long o,x,y,k;
		cin>>o>>x>>y;
		if (o==1)
		{
			cin>>k;
			update1(x,y,k);
		}
		else if(o==3)
		{
			cout<<update0(x,y)%m<<endl;
		}
		else
		{
			cin>>k;
			update11(x,y,k);
		}
	}
	return 0;
}
2025/2/8 15:06
加载中...