真萌新求助基本线段树,30pts对了#1#3#4
查看原帖
真萌新求助基本线段树,30pts对了#1#3#4
261262
WaltVBAlston楼主2021/9/17 15:38

RT,看了很久也看不出来哪里错了,求助!

#include<iostream>
using namespace std;
#define MAXN 100005
int n,m,p,a[MAXN];
struct node{
	int val,add,mul,l,r;
}tree[4*MAXN];
void pushdown(int i){
	tree[i*2].val=(tree[i*2].val*tree[i].mul+tree[i].add*(tree[i*2].r-tree[i*2].l+1))%p; 
	tree[i*2+1].val=(tree[i*2+1].val*tree[i].mul+tree[i].add*(tree[i*2+1].r-tree[i*2+1].l+1))%p;
	tree[i*2].add=(tree[i*2].add*tree[i].mul+tree[i].add)%p;
	tree[i*2+1].add=(tree[i*2+1].add*tree[i].mul+tree[i].add)%p;
	tree[i*2].mul=(tree[i*2].mul*tree[i].mul)%p;
	tree[i*2+1].mul=(tree[i*2+1].mul*tree[i].mul)%p;
	tree[i].add=0;
	tree[i].mul=1;
	return;
}
int sum(int i,int l,int r){
	if(tree[i].l>=l&&tree[i].r<=r)
		return tree[i].val;
	pushdown(i);
	int mid=(tree[i].l+tree[i].r)>>1,res=0;
	if(mid>=l)
		res+=sum(i*2,l,r);
	res%=p;
	if(mid+1<=r)
		res+=sum(i*2+1,l,r);
	res%=p;
	return res;
}
void build(int i,int l,int r){
	tree[i].add=0,tree[i].mul=1;
	tree[i].l=l,tree[i].r=r;
	if(l==r){
		tree[i].val=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	tree[i].val=(tree[i*2].val+tree[i*2+1].val)%p;
	return;
}
void update1(int i,int l,int r,int k){
	if(tree[i].l>=l&&tree[i].r<=r){
		tree[i].add=(tree[i].add*k)%p;
		tree[i].mul=(tree[i].mul*k)%p;
		tree[i].val=(tree[i].val*k)%p;
		return;
	}
	pushdown(i);
	int mid=(tree[i].l+tree[i].r)>>1;
	if(mid>=l)
		update1(i*2,l,r,k);
	if(mid+1<=r)
		update1(i*2+1,l,r,k);
	tree[i].val=(tree[i*2].val+tree[i*2+1].val)%p;
	return;
}
void update2(int i,int l,int r,int k){
	if(tree[i].l>=l&&tree[i].r<=r){
		tree[i].add=(tree[i].add+k)%p;
		tree[i].val=(tree[i].val+k*(tree[i].r-tree[i].l+1))%p;
		return;
	}
	pushdown(i);
	int mid=(tree[i].l+tree[i].r)>>1;
	if(mid>=l)
		update2(i*2,l,r,k);
	if(mid+1<=r)
		update2(i*2+1,l,r,k);
	tree[i].val=(tree[i*2].val+tree[i*2+1].val)%p;
	return;
}
int main(){
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(m--){
		int op,x,y,k;
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			update1(1,x,y,k);
		}
		else if(op==2){
			cin>>k;
			update2(1,x,y,k);
		}
		else
			cout<<sum(1,x,y)<<endl;
	}
	return 0;
}
2021/9/17 15:38
加载中...