0pts求条
查看原帖
0pts求条
884868
封禁用户楼主2025/1/14 22:21
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
struct node{
	ll x,tag1/*乘法*/,tag2;
}tree[110000];
ll s[110000],n,q,m;
void make_tree(ll id,ll l,ll r){
	tree[id].tag1=1;
	if(l==r){
		tree[id].x=s[l];
		tree[id].x%=m;
		return;
	}
	ll mid=(l+r)>>1;
	make_tree(id*2,l,mid);
	make_tree(id*2+1,mid+1,r);
	tree[id].x=tree[id*2].x+tree[id*2+1].x;
	tree[id].x%=m;
}
void make_tag(ll id,ll l,ll r){
	ll mid=(l+r)>>1;
	tree[id*2].x=(tree[id].tag1%m*tree[id*2].x%m)%m+(tree[id].tag2%m*(mid-l+1)%m)%m;
	tree[id*2+1].x=(tree[id].tag1%m*tree[id*2+1].x%m)%m+(tree[id].tag2%m*(r-mid)%m)%m;
	tree[id*2].tag1=(tree[id].tag1%m*tree[id*2].tag1%m)%m;
	tree[id*2+1].tag1=(tree[id].tag1%m*tree[id*2+1].tag1%m)%m;
	tree[id*2].tag2=(tree[id].tag1%m*tree[id*2].tag2%m+tree[id*2].tag1%m)%m;
	tree[id*2+1].tag2=(tree[id].tag1%m*tree[id*2+1].tag2%m+tree[id*2+1].tag1%m)%m;
	tree[id].tag1=1;
	tree[id].tag2=0;
}
void chen(ll id,ll l,ll r,ll l_,ll r_,ll k){
	if(l_<=l&&r<=r_){
		tree[id].x=(tree[id].x%m*k%m)%m;
		tree[id].tag1=(tree[id].tag1%m*k%m)%m;
		tree[id].tag2=(tree[id].tag2%m*k%m)%m;
		return;
	}
	if(tree[id].tag1!=1)
		make_tag(id,l,r);
	if(tree[id].tag2)
		make_tag(id,l,r);
	ll mid=(l+r)>>1;
	if(mid<r_)
		chen(id*2+1,mid+1,r,l_,r_,k);
	if(mid>=l_)
		chen(id*2,l,mid,l_,r_,k);
	tree[id].x=tree[id*2].x+tree[id*2+1].x;
	tree[id].x%=m;
}
void add(ll id,ll l,ll r,ll l_,ll r_,ll k){
//	cout<<id<<' '<<l<<' '<<r<<' '<<l_<<' '<<r_<<' '<<k<<'\n'; 
	if(l_<=l&&r<=r_){
		tree[id].x=(r-l+1)*k%m;
		tree[id].tag2=(tree[id].tag1%m*tree[id].tag2%m+tree[id].x%m)%m;
		return;
	}
	if(tree[id].tag1!=1)
		make_tag(id,l,r);
	if(tree[id].tag2)
		make_tag(id,l,r);
	ll mid=(l+r)>>1;
	if(mid<r_)
		add(id*2+1,mid+1,r,l_,r_,k);
	if(mid>=l_)
		add(id*2,l,mid,l_,r_,k);
	tree[id].x=tree[id*2].x+tree[id*2+1].x;
	tree[id].x%=m;
}
ll find(ll id,ll l,ll r,ll l_,ll r_){
//	cout<<id<<' '<<l<<' '<<r<<' '<<l_<<' '<<r_<<'\n'; 
	if(l_<=l&&r<=r_)
		return tree[id].x%m;
	if(tree[id].tag1!=1)
		make_tag(id,l,r);
	if(tree[id].tag2)
		make_tag(id,l,r);
	ll sum=0,mid=(l+r)>>1;
	if(mid<r_)
		sum+=find(id*2+1,mid+1,r,l_,r_)%m;
	if(mid>=l_)
		sum+=find(id*2,l,mid,l_,r_)%m;
	return sum%m;
}
int main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++)
		cin>>s[i];
	make_tree(1,1,n);
	while(q--){
		ll op,l,r,k;
		cin>>op;
		if(op==1){
			cin>>l>>r>>k;
			chen(1,1,n,l,r,k);
		}
		else if(op==2){
			cin>>l>>r>>k;
			add(1,1,n,l,r,k);
		}
		else{
			cin>>l>>r;
			cout<<find(1,1,n,l,r)<<'\n';
		}
	}
	return 0;
} 

样例没过,不会。。。。。。刚学

2025/1/14 22:21
加载中...