求助60分,求调❤
查看原帖
求助60分,求调❤
601245
I_am_zhima楼主2023/10/7 14:03
#include<bits/stdc++.h>
using namespace std;
#define re register
#define int long long
#define pii pair<int,int>
const int N=1e6+5,inf=1<<27;

int n,mod,q;

int a[N];

struct node{
	int l,r,sum;
	int add,time;
}tr[N<<4];

inline void build(int l,int r,int x){
	tr[x]={l,r,0,0,1};
	if(l==r){
		tr[x].sum=a[l];
		return ;
	}
	
	int mid=l+r>>1;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	tr[x].sum=tr[x<<1].sum+tr[x<<1|1].sum;
}

inline void lazy_down(int x){
	tr[x<<1].sum=(tr[x<<1].sum*tr[x].time+tr[x].add*(tr[x<<1].r-tr[x<<1].l+1))%mod;
	tr[x<<1|1].sum=(tr[x<<1|1].sum*tr[x].time+tr[x].add*(tr[x<<1|1].r-tr[x<<1|1].l+1))%mod;
	
	tr[x<<1].time=(tr[x<<1].time*tr[x].time)%mod;
	tr[x<<1|1].time=(tr[x<<1|1].time*tr[x].time)%mod;
	tr[x<<1].add=(tr[x<<1].add*tr[x].time+tr[x].add)%mod;
	tr[x<<1|1].add=(tr[x<<1|1].add*tr[x].time+tr[x].add)%mod;
	
	tr[x].add=0,tr[x].time=1;
}
inline void update_add(int l,int r,int x,int k){
	if(tr[x].l>r||tr[x].r<l)
		return ;
	if(tr[x].l>=l&&tr[x].r<=r){
		tr[x].sum=(tr[x].sum+k*(tr[x].r-tr[x].l+1))%mod;
		tr[x].add+=k%mod;
		return ;
	}
	
	lazy_down(x);
	update_add(l,r,x<<1,k);
	update_add(l,r,x<<1|1,k);
	tr[x].sum=(tr[x<<1].sum+tr[x<<1|1].sum)%mod;
}
inline void update_time(int l,int r,int x,int k){
	if(tr[x].l>r||tr[x].r<l)
		return ;
	if(tr[x].l>=l&&tr[x].r<=r){
		tr[x].sum=(tr[x].sum*k)%mod;
		tr[x].add*=k,tr[x].time*=k;
		return ;
	}
	
	lazy_down(x);
	update_time(l,r,x<<1,k);
	update_time(l,r,x<<1|1,k);
	tr[x].sum=(tr[x<<1].sum+tr[x<<1|1].sum)%mod;
}

inline int query(int l,int r,int x){
	if(tr[x].l>r||tr[x].r<l)
		return 0;
	if(tr[x].l>=l&&tr[x].r<=r)
		return tr[x].sum;
	
	lazy_down(x);
	return query(l,r,x<<1)+query(l,r,x<<1|1);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	
	cin>>n>>mod;
	for(re int i=1;i<=n;i++)
		cin>>a[i];
	
	build(1,n,1);
	
	cin>>q;
	while(q--){
		int opt;cin>>opt;
		if(opt==1){
			int l,r,time;cin>>l>>r>>time;
			update_time(l,r,1,time);
		}
		else if(opt==2){
			int l,r,add;cin>>l>>r>>add;
			update_add(l,r,1,add);
		}
		else{
			int l,r;cin>>l>>r;
			cout<<query(l,r,1)%mod<<"\n";
		}
	}
	
	return 0;
}
2023/10/7 14:03
加载中...