求助,全WA,样例过了!!!
查看原帖
求助,全WA,样例过了!!!
1192073
yjy_echo楼主2024/4/19 19:26
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
ll n,m,a,x,y,k,ans[N],mod;
struct edge{
	ll l,r;
	ll sum;
	ll lz;
}e[N*4];

inline ll ls(ll x){
    return x<<1;
}

inline ll rs(ll x){
    return x<<1|1;
}

void build(ll k,ll l,ll r){
	e[k].l=l;
	e[k].r=r;
	if(l==r){
		e[k].sum=ans[l];
		return;
	}
	ll mid=(l+r)/2;
	build(ls(k),l,mid);
	build(rs(k),mid+1,r);
	e[k].sum=(e[k*2].sum+e[k*2+1].sum);
}

void pushdown(ll u){
	e[u*2].lz+=e[u].lz;
	e[u*2+1].lz+=e[u].lz;
	e[u*2].sum=(e[u*2].sum+e[u].lz*(e[u*2].r-e[u*2].l+1))%mod;
	e[u*2+1].sum=(e[u*2+1].sum+e[u].lz*(e[u*2+1].r-e[u*2+1].l+1))%mod;
	e[u].lz=0;
}

void push_down(ll u){
	e[u*2].lz+=e[u].lz;
	e[u*2+1].lz+=e[u].lz;
	e[u*2].sum+=e[u].lz*e[u*2].sum%mod;
	e[u*2+1].sum+=e[u].lz*e[u*2+1].sum%mod;
	e[u].lz=0;
}


void pushup(ll u){
	e[u].sum=(e[u*2].sum+e[u*2+1].sum)%mod;
} 

void update(ll l,ll r,ll u,ll x)
{
	if(e[u].r==0||e[u].l==0) return;
    if(l<=e[u].l&&e[u].r<=r){
        e[u].lz+=x;
        e[u].sum+=x*(e[u].r-e[u].l+1);
        e[u].sum%=mod;
        return;
    }
	ll mid=(e[u].r+e[u].l)>>1;
	pushdown(u);
    if(l<=mid) update(l,r,u*2,x);
    if(r>mid) update(l,r,u*2+1,x);
    pushup(u);
}

void up_date(ll l,ll r,ll u,ll x)
{
	if(e[u].r==0||e[u].l==0) return;
    if(l<=e[u].l&&e[u].r<=r){
        e[u].lz=x;
        e[u].sum*=e[u].lz;
        e[u].sum%=mod;
        return;
    }
	ll mid=(e[u].r+e[u].l)>>1;
	push_down(u);
    if(l<=mid) up_date(l,r,u*2,x);
    if(r>mid) up_date(l,r,u*2+1,x);
    pushup(u);
}

void update_ed(ll u,ll l,ll r,ll k){
	if(e[u].l==l&&e[u].r==r){
		e[u].sum+=k;
		return;
	}
	ll mid=(e[u].l+e[u].r)>>1;
	if(l<=mid) update(u*2,l,r,k);
    else update(u*2+1,l,r,k);
    pushup(u);
}

ll query(ll u,ll l,ll r,ll nl,ll nr){
	ll res=0;
	if(e[u].l>r||e[u].r<l) return 0;
	if(e[u].l>=l&&e[u].r<=r) return e[u].sum;
	ll mid=(nl+nr)>>1;
	pushdown(u);
	if(l<=mid){
		res+=(query(ls(u),l,r,nl,mid))%mod;
		res%=mod;
	}
    if(y>mid){
    	res+=(query(rs(u),l,r,mid+1,nr))%mod;
    	res%=mod;
	}
    return res%mod;
}

int main(){
	scanf("%d%d%d",&n,&m,&mod);
	for(ll i=1;i<=n;i++) scanf("%d",&ans[i]);
	build(1,1,n);
	for(ll i=1;i<=m;i++){
		scanf("%d",&a);
		if(a==1){
			scanf("%d%d%d",&x,&y,&k);
			up_date(x,y,1,k);
		} 
		else if(a==2){
			scanf("%d%d%d",&x,&y,&k);
			update(x,y,1,k);
		}
		else{
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,x,y,1,n));
		}
	}
	return 0;
}
2024/4/19 19:26
加载中...