蒟蒻的疑惑
查看原帖
蒟蒻的疑惑
398132
爱好MC的蒟蒻楼主2021/9/11 13:22

这题疑似用高精?

#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
ll n,m,mod,op,x,y,z,a[100005],d[400005],tagj[400005],tagc[400005];
void build(ll x,ll y,ll z){
    tagc[z]=1;
	if(x==y){
		d[z]=a[x];
		return ;
	}
	int q=(x+y)/2;
	build(x,q,z*2);
	build(q+1,y,z*2+1);
	d[z]=d[z*2]+d[z*2+1];
}
inline void push(ll x,ll y,ll id){
    ll q=(x+y)/2;
	if(tagc[id]!=1){
		tagc[id*2+1]=(tagc[id*2+1]*tagc[id])%mod;
		tagc[id*2]=(tagc[id*2]*tagc[id])%mod;
		tagj[id*2+1]=(tagj[id*2+1]*tagc[id])%mod;
		tagj[id*2]=(tagj[id*2]*tagc[id])%mod;
		d[id*2+1]=(d[id*2+1]*tagc[id])%mod;
		d[id*2]=(d[id*2]*tagc[id])%mod;
        tagc[id]=1;
	}
	if(tagj[id]!=0){
		tagj[id*2+1]=(tagj[id*2+1]+tagj[id])%mod;
		tagj[id*2]=(tagj[id*2]+tagj[id])%mod;
		d[id*2]=(d[id*2]+tagj[id]*(q-x+1))%mod;
		d[id*2+1]=(d[id*2+1]+tagj[id]*(y-q))%mod;
        tagj[id]=0;
	}
	return ;
}
void updatej(ll l,ll r,ll al,ll ar,ll x,ll id){
	int q=(al+ar)/2;
	if(l<=al&&ar<=r){
		d[id]=(d[id]+x*(ar-al+1))%mod;
		tagj[id]=(tagj[id]+x)%mod;
		return ;
	}
	push(al,ar,id);
	if(q>=l) updatej(l,r,al,q,x,id*2);
	if(q+1<=r) updatej(l,r,q+1,ar,x,id*2+1);
	d[id]=d[id*2]+d[id*2+1];
}
void updatec(ll l,ll r,ll al,ll ar,ll z,ll id){
	int q=(al+ar)/2;
	if(l<=al&&ar<=r){
		d[id]=(d[id]*z)%mod;
		tagj[id]=(tagj[id]*z)%mod;
		tagc[id]=(tagc[id]*z)%mod;
		return ;
	}
    push(al,ar,id);
	if(q>=l) updatec(l,r,al,q,z,id*2);
	if(q+1<=r) updatec(l,r,q+1,ar,z,id*2+1);
	d[id]=d[id*2]+d[id*2+1];
}
ll query(ll l,ll r,ll al,ll ar,ll id){
    if(l<=al&&r>=ar){
        return d[id];
    }
    ll q=(al+ar)/2,sum=0;
    push(al,ar,id);
    if(q>=l) sum=(sum+query(l,r,al,q,id*2))%mod;
    if(q+1<=r) sum=(sum+query(l,r,q+1,ar,id*2+1))%mod;
    return sum;
}
int main(){
	cin >>n>>mod;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin >>m;
	build(1,n,1);
	while(m--){
		cin >>op;
		if(op==1){
			cin >>x>>y>>z;
			updatec(x,y,1,n,z,1);
		}
		if(op==2){
			cin >>x>>y>>z;
			updatej(x,y,1,n,z,1);
		}
		if(op==3){
			cin >>x>>y;
			cout <<query(x,y,1,n,1)<<endl;;
		}
	}
	return 0;
}

线段树2板子搬过来改了下

long long 60 unsigned long long 80

2021/9/11 13:22
加载中...