求助大佬,这个怎么写错了?
查看原帖
求助大佬,这个怎么写错了?
141577
yhc12345楼主2020/8/4 13:33
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#define INF 0x3f3f3f3f

using namespace std;
typedef long long ll;
int n,m,p;
const int N=1e5+10;
int a[N];
struct Node {
	ll val,add,mul;
}t[4*N];
void build(int rt,int l,int r) {
	if(l==r) {
		t[rt].val=a[l]%p;
		t[rt].add=0;
		t[rt].mul=1;
		return;
	}
	int mid=(l+r)>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	t[rt].val=(t[rt<<1].val+t[rt<<1|1].val)%p;
	t[rt].add=0;
	t[rt].mul=1;
}
void pushdown(int rt,int l,int r) {
	if(t[rt].val==0&&t[rt].mul==1) {
		return;
	}
	int mid=(l+r)>>1;
	t[rt<<1].val=(t[rt<<1].val*t[rt].mul+t[rt].add*(mid-l+1))%p;
	t[rt<<1|1].val=(t[rt<<1|1].val*t[rt].mul+t[rt].add*(r-mid))%p;
	t[rt<<1].add=(t[rt<<1].add*t[rt].mul+t[rt].add)%p;
	t[rt<<1|1].add=(t[rt<<1|1].add*t[rt].mul+t[rt].add)%p;
	t[rt<<1].mul=t[rt<<1].mul*t[rt].mul%p;
	t[rt<<1|1].mul=t[rt<<1|1].mul*t[rt].mul%p;
	t[rt].add=0;
	t[rt].mul=1;
}
void update1(int rt,int l,int r,int L,int R,int v) {
	if(L<=l&&r<=R) {
		t[rt].add=(t[rt].add+v)%p;
		t[rt].val=(t[rt].val+(ll)v*(r-l+1))%p;
		return;
	}
	pushdown(rt,l,r);
	int mid=(l+r)>>1;
	if(L<=mid) {
		update1(rt<<1,l,mid,L,R,v);
	}
	if(R>mid) {
		update1(rt<<1|1,mid+1,r,L,R,v);
	}
	t[rt].val=(t[rt<<1].val+t[rt<<1|1].val)%p;
}
void update2(int rt,int l,int r,int L,int R,int v) {
	if(L<=l&&r<=R) {
		t[rt].mul=t[rt].mul*v%p;
		t[rt].add=t[rt].add*v%p;
		t[rt].val=t[rt].val*v%p;
		return;
	}
	pushdown(rt,l,r);
	int mid=(l+r)>>1;
	if(L<=mid) {
		update2(rt<<1,l,mid,L,R,v);
	}
	if(R>mid) {
		update2(rt<<1|1,mid+1,r,L,R,v);
	}
	t[rt].val=(t[rt<<1].val+t[rt<<1|1].val)%p;
}
ll query(int rt,int l,int r,int L,int R) {
	if(L<=l&&r<=R) {
		return t[rt].val;
	}
	int mid=(l+r)>>1;
	ll res=0;
	pushdown(rt,l,r);
	if(L<=mid) {
		res+=query(rt<<1,l,mid,L,R);
		res%=p;
	}
	if(R>mid) {
		res+=query(rt<<1|1,mid+1,r,L,R);
		res%=p;
	}
	return res%p;
}
int main() {
	ios::sync_with_stdio(false);
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++) {
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=m;i++) {
		int op,x,y,k;
		scanf("%d%d%d",&op,&x,&y);
		if(op==1) {
			scanf("%d",&k);
			update2(1,1,n,x,y,k);
		}
		else if(op==2) {
			scanf("%d",&k);
			update1(1,1,n,x,y,k);
		}
		else if(op==3) {
			printf("%lld\n",query(1,1,n,x,y));
		}
	}
	return 0;
}

2020/8/4 13:33
加载中...