0pts 样例过得了 求调
查看原帖
0pts 样例过得了 求调
610349
tracy_yuxi楼主2024/10/23 20:37
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lc p<<1
#define rc p<<1|1
const int N=1e5+5;
int n,q,mod;
struct node{int l,r,sum,add,add2;}tr[N*4];
int a[N];
void build(int p,int l,int r){
	tr[p].l=l;tr[p].r=r;tr[p].add2=1;tr[p].add=0;
	if(l==r){tr[p].sum=a[l];return;}
	int mid=l+r>>1;
	build(lc,l,mid);build(rc,mid+1,r);
	tr[p].sum=(tr[lc].sum+tr[rc].sum)%mod;
}
void pushdown(int p){
	if(tr[p].add||tr[p].add2!=1){
		tr[lc].sum=(tr[lc].sum*tr[p].add2+tr[p].add*(tr[lc].r-tr[lc].r+1))%mod;
		tr[rc].sum=(tr[rc].sum*tr[p].add2+tr[p].add*(tr[rc].r-tr[rc].r+1))%mod;
		tr[lc].add2*=tr[p].add2;tr[rc].add2*=tr[p].add2;
		tr[lc].add+=tr[p].add;tr[rc].add+=tr[p].add;
		tr[lc].add2%=mod;tr[rc].add2%=mod;
		tr[p].add=0;tr[p].add2=1;
	}
}
void update1(int p,int x,int y,int k){
	if(tr[p].l>=x&&tr[p].r<=y){
		tr[p].sum+=k*(tr[p].r-tr[p].l+1);tr[p].sum%=mod;
		tr[p].add+=k;tr[p].add%=mod;
		return;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid)update1(lc,x,y,k);
	if(y>mid)update1(rc,x,y,k);
	tr[p].sum=(tr[lc].sum+tr[rc].sum)%mod;
}
void update2(int p,int x,int y,int k){
	if(y<tr[p].l||x>tr[p].r)return;
	if(tr[p].l>=x&&tr[p].r<=y){
		tr[p].sum*=k;tr[p].sum%=mod;
		tr[p].add2=tr[p].add2*k%mod;
		tr[p].add=tr[p].add*k%mod;
		return;
	}
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	if(x<=mid)update2(lc,x,y,k);
	if(y>mid)update2(rc,x,y,k);
	tr[p].sum=(tr[lc].sum+tr[rc].sum)%mod;
}
int query(int p,int x,int y){
	if(x<=tr[p].l&y>=tr[p].r)return tr[p].sum%mod;
	pushdown(p);
	int mid=tr[p].l+tr[p].r>>1;
	int sum=0;
	if(x<=mid)sum+=query(lc,x,y),sum%=mod;
	if(y>mid)sum+=query(rc,x,y),sum%=mod;
	return sum;
}
signed main(){
	cin>>n>>q>>mod;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(q--){
		int op,x,y;cin>>op>>x>>y;
		if(op==1){
			int k;cin>>k;
			update2(1,x,y,k);
		}else if(op==2){
			int k;cin>>k;
			update1(1,x,y,k);
		}else if(op==3){
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2024/10/23 20:37
加载中...