线段树30ptsRE
查看原帖
线段树30ptsRE
1055721
Skyss楼主2024/11/30 00:03

帮帮孩子,求调,7个点re了

#include<bits/stdc++.h>
#define ls(o) (o << 1)
#define rs(o) (o << 1 | 1)

using namespace std;
const long long maxn = 10000010;
long long p;
long long d[maxn*6],tagp[maxn*6],tagm[maxn*6],a[maxn*6];


void update(long long o,long long l,long long r){
	long long mid = (l + r) >> 1;
	if(tagm[o] != 1){
		tagm[ls(o)] *= tagm[o];
		tagm[ls(o)] %= p;
		tagm[rs(o)] *= tagm[o];
		tagm[rs(o)] %= p;
		tagp[ls(o)] *= tagm[o];
		tagp[ls(o)] %= p;
		tagp[rs(o)] *= tagm[o];
		tagp[rs(o)] %= p;
		d[ls(o)] *= tagm[o];
		d[ls(o)] %= p;
		d[rs(o)] *= tagm[o];
		d[rs(o)] %= p;
		tagm[o] = 1;
	}
	if(tagp[o]){
		d[ls(o)] += (mid - l + 1) * tagp[o];
		d[ls(o)] %= p;
		d[rs(o)] += (r - mid) * tagp[o];
		d[rs(o)] %= p;
		tagp[ls(o)] += tagp[o];
		tagp[ls(o)] %= p;
		tagp[rs(o)] += tagp[o];
		tagp[rs(o)] %= p;
		tagp[o] = 0;
	}
	return;
}

void build(long long o,long long l,long long r){
	tagm[o] = 1;
	if(l == r){
		d[o] = a[r];
		return;
	}
	long long mid = (l + r) >> 1;
	build(ls(o),l,mid);
	build(rs(o),mid+1,r);
	d[o] = (d[ls(o)] + d[rs(o)]) % p;
}

void Mul(long long l,long long r,long long c,long long s,long long t,long long o){
	long long mid = (s + t) >> 1;
	if(l <= s && t <= r){
		d[o] *= c;
		d[o] %= p;
		tagm[o] *= c;
		tagm[o] %= p;
		tagp[o] *= c;
		tagp[o] %= p;
		return;
	}
	update(o,s,t);
	if(l <= mid)	Mul(l,r,c,s,mid,ls(o));
	if(r > mid)		Mul(l,r,c,mid+1,r,rs(o));
	d[o] = (d[ls(o)] + d[rs(o)]) % p;
}

void Plus(long long l,long long r,long long c,long long s,long long t,long long o){
	long long mid = (s + t) >> 1;
	if(l <= s && t <= r){
		d[o] += (t - s + 1) * c;
		d[o] %= p;
		tagp[o] += c;
		tagp[o] %= p;
		return;
	}
	update(o,s,t);
	if(l <= mid)	Plus(l,r,c,s,mid,ls(o));
	if(r > mid)		Plus(l,r,c,mid+1,t,rs(o));
	d[o] = (d[ls(o)] + d[rs(o)]) % p;
}	

long long Query(long long l,long long r,long long s,long long t,long long o){
	long long mid = (s + t) >> 1; 
	if(l <= s && t <= r)	return d[o];
	update(o,s,t);
	long long tmp = 0;
	if(l <= mid)	tmp += Query(l,r,s,mid,ls(o));
	tmp %= p;
	if(r > mid)		tmp += Query(l,r,mid+1,t,rs(o));
	return tmp % p;
}


int main()
{
	long long n,m;
	cin>>n>>m>>p;
	for(long long i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	
	build(1,1,n);
	
	for(long long i=1;i<=m;i++){
		long long opt,x,y,k;
		scanf("%lld",&opt);
		if(opt == 1){
			scanf("%lld %lld %lld",&x,&y,&k);
			Mul(x,y,k,1,n,1);
		}
		else if(opt == 2){
			scanf("%lld %lld %lld",&x,&y,&k);
			Plus(x,y,k,1,n,1);
		}
		else if(opt == 3){
			scanf("%lld %lld",&x,&y);
			cout<<Query(x,y,1,n,1)<<endl;
		}
	}
	return 0;
}
2024/11/30 00:03
加载中...