玄关,WA了,求调!
查看原帖
玄关,WA了,求调!
1007677
bianyanze楼主2024/9/24 22:11

本人代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct segtree{
	int l,r;
	long long sum;
	int add,mul;
}a[N<<2];
int data[N];
int n,m,p;
void pushup(int u){
	a[u].sum=(a[u<<1].sum+a[u<<1|1].sum)%p;
}
void build(int u,int l,int r){
	a[u].l=l,a[u].r=r;
	a[u].add=0,a[u].mul=1;
	if(l==r){
		a[u].sum=data[l];
		return;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void pushdown(int u){
	a[u<<1].sum=(long long)(a[u].mul*a[u<<1].sum+(a[u<<1].r-a[u<<1].l+1)*a[u].add%p)%p;
	a[u<<1].sum=(long long)(a[u].mul*a[u<<1|1].sum+(a[u<<1|1].r-a[u<<1|1].l+1)*a[u].add%p)%p;
	a[u<<1].mul=(long long)(a[u<<1].mul*a[u].mul)%p;
	a[u<<1|1].mul=(long long)(a[u<<1|1].mul*a[u].mul)%p;
	a[u<<1].add=(long long)(a[u].mul*a[u<<1].add+a[u].add)%p;
	a[u<<1|1].add=(long long)(a[u].mul*a[u<<1|1].add+a[u].add)%p;
	a[u].add=0,a[u].mul=1;
}
void update_add(int u,int l,int r,int k){
	if(a[u].l>=l&&a[u].r<=r){
		a[u].add=(a[u].add+k)%p;
		a[u].sum=(long long)(a[u].sum+k*(a[u].r-a[u].l+1))%p;
		return;
	}
	pushdown(u);
	pushup(u);
	int mid=a[u].l+a[u].r>>1;
	if(l<=mid)update_add(u<<1,l,r,k);
	if(mid<r)update_add(u<<1|1,l,r,k);
	pushup(u);
}
void update_mul(int u,int l,int r,int k){
	if(a[u].l>=l&&a[u].r<=r){
		a[u].add=(a[u].add*k)%p;
		a[u].mul=(a[u].mul*k)%p;
		a[u].sum=(a[u].sum*k)%p;
		return;
	}
	pushdown(u);
	pushup(u);
	int mid=a[u].l+a[u].r>>1;
	if(l<=mid)update_mul(u<<1,l,r,k);
	if(mid<r)update_mul(u<<1|1,l,r,k);
	pushup(u);
}
long long query(int u,int l,int r){
	if(a[u].l>=l&&a[u].r<=r){
		return a[u].sum;
	}
	long long ans=0;
	pushdown(u);
	int mid=a[u].l+a[u].r>>1;
	if(l<=mid)ans+=query(u<<1,l,r);
	if(mid<r)ans+=query(u<<1|1,l,r);
	return ans;
}
int op,e,f,c;
int main(){

	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++){
		scanf("%d",&data[i]);
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d",&e,&f,&c);
			update_mul(1,e,f,c);
		}
		if(op==2){
			scanf("%d%d%d",&e,&f,&c);
			update_add(1,e,f,c);
		}
		if(op==3){
			scanf("%d%d",&e,&f);
			printf("%lld\n",query(1,e,f));
		}
	}
	return 0;
}

2024/9/24 22:11
加载中...