ID returned 1 exit status求调
查看原帖
ID returned 1 exit status求调
1075788
wanghaoyu120104楼主2025/6/22 10:21
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=1000010;
//const int mod=571373;
unsigned ll n,q,m;
unsigned ll a[N],ans[N<<2],t[N<<2],t1[N<<2];
void build(ll p,ll l,ll r);
void f(ll p,ll l,ll r,ll k1,ll k2);
void push_down(ll p,ll l,ll r);
void upd_mul(int p,int l,int r,int x,int y,int k);
void upd_add(int p,int l,int r,int x,int y,int k);
ll get_sum(ll x,ll y,ll l,ll r,ll p);
int main()
{
    cin>>n>>q>>m;
    for(int i=1;i<=n;i++)
    	cin>>a[i];
    build(1,1,n);
    while(q--)
    {
        ll f,x,y,k;
        cin>>f;
        if(f==1)
        {
        	cin>>x>>y>>k;
        	upd_mul(1,1,n,x,y,k);
		}
		if(f==2)
		{
			cin>>x>>y>>k;
			upd_add(1,1,n,x,y,k);
		}
		if(f==3)
		{
			cin>>x>>y;
			cout<<get_sum(x,y,1,n,1);
		}
    }
    return 0;
}
void build(ll p,ll l,ll r)
{
    t[p]=0;
    if(l==r)
	{
		ans[p]=a[l];
		return ;
	}
    ll mid=l+r>>1;
    build(2*p,l,mid);
    build(2*p+1,mid+1,r);
    ans[p]=ans[2*p]+ans[2*p+1];
    ans[p]%=m;
} 
void f(ll p,ll l,ll r,ll k1,ll k2)
{
    t[p]+=k1;
    t[p]%=m;
    t1[p]*=k2%m;
    t1[p]%=m;
    ans[p]=(ans[p]*k2+k1)+k1*(r-l+1);
    return;
}
void push_down(ll p,ll l,ll r)
{
    ll mid=(l+r)>>1;
    f(2*p,l,mid,t[p],t1[p]);
    f(2*p+1,mid+1,r,t[p],t1[p]);
    t[p]=0;
    t1[p]=1;
}
void upd_mul(ll p,ll l,ll r,ll x,ll y,ll k)
{
	if(x<=l && r<=y)
	{
		t[p]=(t[p]*k)%m;
		t1[p]=(t1[p]*k)%m;
		ans[p]=(ans[p]*k)%m;
		return;
	}
	
	push_down(p,l,r);
	ll mid=l+r>>1;
	if(x<=mid)
		upd_mul(2*p,l,mid,x,y,k);
	if(y>mid)
		upd_mul(2*p+1,mid+1,r,x,y,k);
    ans[p]=ans[2*p]+ans[2*p+1]*m;
	return;
}

void upd_add(ll p,ll l,ll r,ll x,ll y,ll k)
{
	if (x<=l && r<=y)
	{
		t[p]=(t[p]+k)%m;
		ans[p]+=(k*(r-l+1))%m;
		ans[p]%=m;
		return;
	}
	push_down(p,l,r);
	ll mid=l+r>>1;
	if (x<=mid)
		upd_add(2*p,l,mid,x,y,k);
	if(y>mid)
		upd_add(2*p+1,mid+1,r,x,y,k);
	ans[p]=ans[2*p]+ans[2*p+1];
	ans[p]%=m;
	return;
}
ll get_sum(ll x,ll y,ll l,ll r,ll p)
{
    ll res=0;
    if(x<=l && r<=y)
		return ans[p];
    ll mid=(l+r)>>1;
    push_down(p,l,r);
    if(x<=mid)
		res+=get_sum(x,y,l,mid,2*p);
    if(y>mid)
		res+=get_sum(x,y,mid+1,r,2*p+1);
    return res;
}
/*
     .       ______      ____     ____     ________
    / \     /           |        |    \       |
   /   \    |           ----     |    /       |
  /_____\   |          |         |---         |
 /       \  \          |         |            |
/         \   ------   ------    |            |


*/

2025/6/22 10:21
加载中...