0分求调
查看原帖
0分求调
1278358
tmc110427楼主2024/7/12 08:02
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll tree1[100005],tree2[100005];
int lowbit(int x){return x&(-x);}
void update1(int x,int y){while(x<=100005){tree1[x]+=y;x+=lowbit(x);}}
void update2(int x,int y){while(x<=100005){tree2[x]+=y;x+=lowbit(x);}}
void c1(int x,int y){while(x<=100005){tree1[x]*=y;x*=lowbit(x);}}
void c2(int x,int y){while(x<=100005){tree2[x]*=y;x*=lowbit(x);}}
ll sum1(ll x){ll ans=0;while(x>0){ans+=tree1[x];x-=lowbit(x);}return ans;}
ll sum2(ll x){ll ans=0;while(x>0){ans+=tree2[x];x-=lowbit(x);}return ans;}
int main()
{
	ll n,mod,m;
	cin>>n>>m>>mod;
	ll old=0,a;
	for(int i=1;i<=n;i++)
	{
		cin>>a;
		update1(i,a-old);
		update2(i,(i-1)*(a-old));
		old=a;
	}
	while(m--)
	{
		ll q,x,y,z;
		cin>>q>>x>>y;
		if(q==2)
		{
			cin>>z;
			update1(x,z);
			update1(y+1,-z);
			update2(x,z*(x-1));
			update2(y+1,-z*y);
		}
		if(q==1)
		{
			cin>>z;
			c1(x,z);
			c1(y+1,-z);
			c2(x,z*(x-1));
			c2(y+1,-z*y);
		}
		if(q==3)cout<<(y*sum1(y)-sum2(y)-(x-1)*sum1(x-1)+sum2(x-1))%mod<<endl;
	}
	return 0;
}
2024/7/12 08:02
加载中...