70pts WA #2 #9 #10大佬求调QAQ
查看原帖
70pts WA #2 #9 #10大佬求调QAQ
1350930
day_1AC楼主2024/12/12 10:47
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e5+7;
const int M=1e5+7;
ll a[M],mod;
int n,m;
struct Tree{
	int l,r;
	ll sum,plz,mlz;              //mlz乘惰标,plz和惰标; 
}tree[N];

void build(int x,int l,int r){
	if(l==r){
		tree[x].l=tree[x].r=l;
		tree[x].sum=a[l]%mod;
		tree[x].mlz=1;
		return ;
	}
	int mid=l+(r-l)/2;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%mod;
	tree[x].l=l,tree[x].r=r; 
	tree[x].mlz=1;
	return ;
}

void push_down(int i){
	ll k1=tree[i].mlz,k2=tree[i].plz;
	int mid=tree[i].l+(tree[i].r-tree[i].l)/2;
	tree[i<<1].sum=(tree[i<<1].sum*k1+(mid-tree[i].l+1)*k2)%mod;
	tree[i<<1|1].sum=(tree[i<<1|1].sum*k1+(tree[i].r-mid)*k2)%mod;
	tree[i<<1].mlz=tree[i<<1].mlz*k1%mod;
	tree[i<<1|1].mlz=tree[i<<1|1].mlz*k1%mod;
	tree[i<<1].plz=(tree[i<<1].plz*k1+k2)%mod;
	tree[i<<1|1].plz=(tree[i<<1|1].plz*k1+k2)%mod;
	tree[i].mlz=1;
	tree[i].plz=0;
	return ;
}

void add1(int x,int l,int r,int k){
	if(tree[x].l>=l&&tree[x].r<=r){
		tree[x].sum=tree[x].sum*k%mod;
		tree[x].mlz=tree[x].mlz*k%mod;
		tree[x].plz=tree[x].plz*k%mod;
		return ;
	}
	push_down(x);
	if(l<=tree[x<<1].r) add1(x<<1,l,r,k);
	if(r>=tree[x<<1|1].l) add1(x<<1|1,l,r,k);
	tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%mod; 
	return ;
}

void add2(int x,int l,int r,int k){
	if(tree[x].l>=l&&tree[x].r<=r){
		tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
		tree[x].plz+=k;
		return ;
	}
	push_down(x);
	if(l<=tree[x<<1].r) add2(x<<1,l,r,k);
	if(r>=tree[x<<1|1].l) add2(x<<1|1,l,r,k);
	tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%mod; 
	return ;
}

ll search(int x,int l,int r){
	if(tree[x].l>=l&&tree[x].r<=r) return tree[x].sum;
	if(tree[x].r<l||tree[x].l>r)  return 0;
	push_down(x);
    ll k=0;
	if(tree[x<<1].r>=l) k=(k+search(x<<1,l,r))%mod;
	if(tree[x<<1|1].l<=r) k=(k+search(x<<1|1,l,r))%mod;
	return k;
}

int main(){
	//ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	//cin>>n>>m>>mod;
	scanf("%d %d %lld",&n,&m,&mod); 
	for(int i=1;i<=n;i++)  scanf("%lld",&a[i]);
	//cin>>a[i];
	build(1,1,n);
	int f,a,b;
	while(m--){
		//cin>>f;
		scanf("%d",&f);
		if(f==1){
			//cin>>a>>b>>f;
			scanf("%d %d %d",&a,&b,&f);
			add1(1,a,b,f);
			continue;
		}
		if(f==2){
			//cin>>a>>b>>f;
			scanf("%d %d %d",&a,&b,&f);
			add2(1,a,b,f);
			continue; 
		}
		if(f==3){
			//cin>>a>>b;
			scanf("%d %d",&a,&b);
			cout<<search(1,a,b)<<endl;
		}
	}
	return 0;
}
2024/12/12 10:47
加载中...