救救孩子吧
查看原帖
救救孩子吧
528740
lonely_star楼主2024/7/25 15:07
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+2;
struct node{
	int l,r;
	long long sum,lz1,lz2;
} tmp[maxn*4];
int n,q,m;
int a[maxn];
void build(int now,int l,int r){
	tmp[now].lz1=1;
	tmp[now].l=l;
	tmp[now].r=r;
	if(l==r){
		tmp[now].sum=a[l];
		tmp[now].sum%=m;
		return;
	}
	int mid=(l+r)/2;
	build(2*now,l,mid);
	build(2*now+1,mid+1,r);
	tmp[now].sum=tmp[2*now].sum+tmp[2*now+1].sum;
	tmp[now].sum%=m;
}
void pushdown(int now){
	if(tmp[now].lz1==1&&tmp[now].lz2==0)return;
	int mid=(tmp[now].l+tmp[now].r)/2;
	tmp[now*2].sum=tmp[2*now].sum*tmp[now].lz1+tmp[now].lz2*(mid-tmp[now].l-1);
	tmp[now*2].sum%=m;
	tmp[now*2+1].sum=tmp[2*now+1].sum*tmp[now].lz1+tmp[now].lz2*(tmp[now].r-mid);
	tmp[now*2+1].sum%=m;
	tmp[now*2].lz1=tmp[now*2].lz1*tmp[now].lz1;
	tmp[now*2].lz1%=m;
	tmp[now*2+1].lz1=tmp[now*2+1].lz1*tmp[now].lz1;
	tmp[now*2+1].lz1%=m;
	tmp[now*2].lz2=tmp[now*2].lz2*tmp[now].lz1+tmp[now].lz2;
	tmp[now*2].lz2%=m;
	tmp[now*2+1].lz2=tmp[now*2+1].lz2*tmp[now].lz1+tmp[now].lz2;
	tmp[now*2+1].lz2%=m;
	tmp[now].lz1=1;
	tmp[now].lz2=0;
	return;
}
void mul(int now,int l,int r,int k){
	if(tmp[now].l>=l&&tmp[now].r<=r){
		tmp[now].sum*=k;
		tmp[now].lz1+=k;
		return;
	}
	pushdown(now);
	int mid=(tmp[now].l+tmp[now].r)/2;
	mul(now*2,l,mid,k);
	mul(now*2+1,mid+1,r,k);
	tmp[now].sum=tmp[now*2].sum+tmp[now*2+1].sum;
	tmp[now].sum%=m;
	return;
}
void add(int now,int l,int r,int k){
	if(tmp[now].l>=l&&tmp[now].r<=r){
		tmp[now].sum+=k*(tmp[now].r-tmp[now].l+1);
		tmp[now].sum%=m;
		tmp[now].lz2+=k;
		return;
	}
	pushdown(now);
	if(tmp[now*2].r>=l)add(now*2,l,r,k);
	if(tmp[now*2+1].l<=r)add(now*2+1,l,r,k);
	tmp[now].sum=tmp[now*2].sum+tmp[now*2+1].sum;
	tmp[now].sum%=m;
}
long long check(int now,int l,int r){
	if(tmp[now].r<l||tmp[now].l>r){
		return 0;
	}
	if(l<=tmp[now].l&&tmp[now].r<=r){
		return tmp[now].sum;
	}
	int mid=(tmp[now].l+tmp[now].r)/2;
	long long w=0;
	w+=check(now*2,l,mid);
	w+=check(now*2+1,mid+1,r);
	return w%m;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	int l,x,y,k;
	for(int i=1;i<=q;i++){
		cin>>l>>x>>y;
		if(l==1){
			cin>>k;
			mul(1,x,y,k);
		}else if(l==2){
			cin>>k;
			add(1,x,y,k);
		}else{
			cout<<check(1,x,y)<<"\n";
		}
	}
	return 0;
}

首先,我承认这个码很丑陋

其次,它到底错哪里了( ๑ŏ ﹏ ŏ๑ )伤心

2024/7/25 15:07
加载中...