能过样例但一分不得,求条,玄1关
查看原帖
能过样例但一分不得,求条,玄1关
1069294
Laihaocheng楼主2025/1/28 22:56

orz

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
typedef long long ll;
#define ls u<<1
#define rs u<<1|1
struct node{
	ll l,r;
	ll sum,add,mul;
}tr[N<<2];
ll n,m,mod,w[N];
void lazy(ll u,ll v,ll w){
	tr[u].sum=(tr[u].sum+v*(tr[u].r-tr[u].l+1))%mod;
	tr[u].add+=v;
	tr[u].add%=mod;
	tr[u].sum=tr[u].sum*w%mod;
	tr[u].mul*=w;
	tr[u].mul%=mod;
}
void down(ll u){
	if(tr[u].mul>1||tr[u].add){
		lazy(ls,tr[u].add,tr[u].mul),lazy(rs,tr[u].add,tr[u].mul);
		tr[u].add=0,tr[u].mul=1;
	}
}
void up(ll u){
	tr[u].sum=(tr[ls].sum+tr[rs].sum)%mod;
}
void build(ll u,ll l,ll r){
	if(l==r) tr[u]={l,r,w[l]%mod,0,1};
	else{
		tr[u]={l,r,0,0,1};
		ll mid=l+r>>1;
		build(ls,l,mid),build(rs,mid+1,r);
		up(u);
	}
}
void add(ll u,ll l,ll r,ll v){
	if(tr[u].l>=l&&tr[u].r<=r) lazy(u,v,1);
	else{
		down(u);
		ll mid=tr[u].l+tr[u].r>>1;
		if(l<=mid) add(ls,l,r,v);
		if(r>mid) add(rs,l,r,v);
		up(u);
	}
}
void mul(ll u,ll l,ll r,ll v){
	if(tr[u].l>=l&&tr[u].r<=r) lazy(u,0,v);
	else{
		down(u);
		ll mid=tr[u].l+tr[u].r>>1;
		if(l<=mid) mul(ls,l,r,v);
		if(r>mid) mul(rs,l,r,v);
		up(u);
	}
}
ll query(ll u,ll l,ll r){
	if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;
	down(u);
	ll mid=tr[u].l+tr[u].r>>1;
	ll res=0;
	if(l<=mid) res=(res+query(ls,l,r))%mod;
	if(r>mid) res=(res+query(rs,l,r))%mod;
	return res;
}
int main(){
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(ll i=1;i<=n;i++) scanf("%lld",&w[i]);
	build(1,1,n);
	// display();
	while(m--){
		ll op,l,r;
		scanf("%lld%lld%lld",&op,&l,&r);
		if(op==1){
			ll d;
			scanf("%lld",&d);
			mul(1,l,r,d);
		}else if(op==2){
			ll d;
			scanf("%lld",&d);
			add(1,l,r,d);
		}else{
			printf("%lld\n",query(1,l,r)%mod);
		}
	}
	return 0;
}
2025/1/28 22:56
加载中...