求助30pts,只过了第1,3,4个测试点
查看原帖
求助30pts,只过了第1,3,4个测试点
421754
I_m_IOI_AKing楼主2022/8/25 14:39
#include<bits/stdc++.h>
using namespace std;

long long n,m,opt,x,y,k,mod,a[1000086];

struct t{
	long long val,mul,add;
}tree[1000086*4];

void push_down(long long p,long long l,long long r){
	long long mid=(l+r)>>1;
	tree[p*2].val=(tree[p*2].val%mod*tree[p].mul%mod+tree[p].add%mod*(mid-l+1)%mod)%mod;
	tree[p*2+1].val=(tree[p*2+1].val%mod*tree[p].mul%mod+tree[p].add%mod*(r-mid)%mod)%mod;
	tree[p*2].mul=(tree[p*2].mul%mod*tree[p].mul%mod)%mod;
	tree[p*2+1].mul=(tree[p*2+1].mul%mod*tree[p].mul%mod)%mod;
	tree[p*2].add=(tree[p*2].add%mod*tree[p].mul%mod+tree[p].add%mod)%mod;
	tree[p].mul=1,tree[p].add=0;
}

void build(long long l,long long r,long long p){
	tree[p].add=0,tree[p].mul=1;
	if(l==r){
		tree[p].val=a[l]%mod;
	}else{
		long long mid=(l+r)>>1;
		build(l,mid,p*2);
		build(mid+1,r,p*2+1);
		tree[p].val=(tree[p*2].val%mod+tree[p*2+1].val%mod)%mod;	
	}
	tree[p].val%=mod;
	return;
}
//[cl,cr]是当前区间,[l,r]是目标区间 
void add(long long l,long long r,long long cl,long long cr,long long p,long long d){
	if(l>cr || r<cl) return;
	if(l<=cl && r>=cr){
		tree[p].val=(tree[p].val%mod+d%mod*(cr-cl+1)%mod)%mod;
		tree[p].add=(tree[p].add%mod+d%mod)%mod;
		return;
	}
	push_down(p,cl,cr);
	long long mid=(cl+cr)>>1;
	add(l,r,cl,mid,p*2,d);
	add(l,r,mid+1,cr,p*2+1,d);
	tree[p].val=(tree[p*2].val%mod+tree[p*2+1].val%mod)%mod;
	return;
}

void mul(long long l,long long r,long long cl,long long cr,long long p,long long d){
	if(l>cr || r<cl) return;
	if(l<=cl && r>=cr){
		tree[p].val=(tree[p].val*d)%mod;
		tree[p].add=(tree[p].add*d)%mod;
		tree[p].mul=(tree[p].mul*d)%mod;
		return;
	}
	push_down(p,cl,cr);
	long long mid=(cl+cr)>>1;
	mul(l,r,cl,mid,p*2,d);
	mul(l,r,mid+1,cr,p*2+1,d);
	tree[p].val=(tree[p*2].val%mod+tree[p*2+1].val%mod)%mod;
	return;
}

long long query(long long l,long long r,long long cl,long long cr,long long p){
	if(cl>r || cr<l) return 0;
	else if(cl>= l && cr<=r) return tree[p].val%mod;
	else{
		push_down(p,cl,cr);
		long long mid=(cl+cr)>>1;
		return (query(l,r,cl,mid,p*2)%mod+query(l,r,mid+1,cr,p*2+1)%mod)%mod;
	}
}


int main(){
	cin>>n>>m>>mod;
	for(long long i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	for(long long i=1;i<=m;i++){
		cin>>opt>>x>>y;
		if(opt==1){
			cin>>k;
			mul(x,y,1,n,1,k);
		}else if(opt==2){
			cin>>k;
			add(x,y,1,n,1,k);
		}else
			cout<<query(x,y,1,n,1)%mod<<endl;
	}
	return 0;
}

快自闭啦,请教大佬(鞠躬)

2022/8/25 14:39
加载中...