样例过了0分,求调
查看原帖
样例过了0分,求调
669921
czx2010楼主2023/7/13 11:05

注:jntmtp2特判乘法;jntmtp1特判加法


#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
 
ll n, m, p;

ll a[2000005];

struct node{

	ll l, r;
	ll sum, lazy, lazy2;
    
}b[4000005];

void buld(ll l, ll r, ll shit){

	b[shit].l = l;   
	b[shit].r = r;   
	if(l == r){   
		b[shit].sum = a[l];       
		return;        
	}
	ll medium = (l+r)>>1;    
	buld(l, medium, shit*2);    
	buld(medium+1, r, shit*2+1);    
	b[shit].sum = [shit*2].sum+b[shit*2+1].sum;    
	return; 
}

void jntmtp(ll shit){

	if(b[shit].lazy){   
		b[shit*2].sum += b[shit].lazy*(b[shit*2].r-b[shit*2].l+1);       
		b[shit*2+1].sum += b[shit].lazy*(b[shit*2+1].r-b[shit*2+1].l+1);       
		b[shit*2].lazy += b[shit].lazy;     
		b[shit*2+1].lazy += b[shit].lazy;       
		b[shit].lazy = 0;
	}    
	return;    
} 

void jntmtp2(ll shit){

	if(b[shit].lazy2){  
		b[shit*2].sum *= b[shit].lazy2*(b[shit*2].r-b[shit*2].l+1);  
		b[shit*2+1].sum *= b[shit].lazy2*(b[shit*2+1].r-b[shit*2+1].l+1);       
		b[shit*2].lazy2 *= b[shit].lazy2;       
		b[shit*2+1].lazy2 *= b[shit].lazy2;     
		b[shit*2].lazy *= b[shit].lazy2;       
		b[shit*2+1].lazy *= b[shit].lazy2;  
		b[shit].lazy2 = 0;
	}    
	return;    
}
void jntmjf(ll shit, ll ji, ll ni, ll tai){

	if(ji<=b[shit].l&&ni>=b[shit].r){
		b[shit].sum+=(tai*(b[shit].r-b[shit].l+1))%p;       
		b[shit].lazy+=tai;       
		b[shit].lazy%=p;       
		return;
	}   
	jntmtp(shit);    
	ll medium = (b[shit].l+b[shit].r)>>1;    
	if(ji<=medium){
		jntmjf(shit*2, ji, ni, tai);
	}
	if(ni>medium){;
		jntmjf(shit*2+1, ji, ni, tai);
	}
	b[shit].sum = b[shit*2].sum+b[shit*2+1].sum;
}
void jntmcf(ll shit, ll ji, ll ni, ll tai){

	if(ji<=b[shit].l&&ni>=b[shit].r){
		b[shit].sum*=(tai*(b[shit].r-b[shit].l+1)%p);
		b[shit].sum%=p;
		b[shit].lazy2*=tai;
		b[shit].lazy2%=p;
		return;
	}
	jntmtp2(shit);
	ll medium = (b[shit].l+b[shit].r)>>1;
	if(ji<=medium){
		jntmcf((shit*2)%p, ji, ni, tai);
	}
	if(ni>medium){;
		jntmcf((shit*2+1)%p, ji, ni, tai);
	}
	b[shit].sum = b[shit*2].sum+b[shit*2+1].sum;
}
ll jntmqh(ll shit, ll ji, ll ni){

	if(ji<=b[shit].l&&ni>=b[shit].r){
		return b[shit].sum;
	}
	jntmtp(shit);
	ll medium = (b[shit].l+b[shit].r)>>1;
	ll ans = 0;
	if(ji<=medium){
		ans+=jntmqh((shit*2)%p, ji, ni);
	}
	if(ni>medium){
		ans+=jntmqh((shit*2+1)%p, ji, ni);
	}
	return ans;
}
int main(){

    cin>>n>>m>>p;
    for (ll i=1;i<=n;i++){
    	cin>>a[i];
	}
	buld(1,n,1);
	for (ll i=1;i<=m;i++){
		ll heizi, ji, ni, tai;
		cin>>heizi;
		if(heizi == 2){
			cin>>ji>>ni>>tai;
			jntmjf(1, ji, ni, tai);
		}
		if(heizi == 3){
			cin>>ji>>ni;
			cout<<jntmqh(1, ji, ni)%p<<endl;
		}
		if(heizi == 1){
			cin>>ji>>ni>>tai;
			jntmcf(1, ji, ni, tai);
		}
	}
    return 0;	
}
2023/7/13 11:05
加载中...