萌新刚学OI,求教线段树模板2
  • 板块灌水区
  • 楼主bsTiat
  • 当前回复4
  • 已保存回复4
  • 发布时间2020/11/24 13:38
  • 上次更新2023/11/5 07:25:38
查看原帖
萌新刚学OI,求教线段树模板2
211086
bsTiat楼主2020/11/24 13:38

RT,样例过了,但全WA

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100005],p;
struct note{
	int l;
	int r;
	long long sum;
	long long add;
	long long mul;
}t[500005];
void build(long long p,long long l,long long r){
	t[p].l=l;
	t[p].r=r;
	if(l==r){
		t[p].sum=a[l]%p;
		return;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].sum=(t[p*2].sum+t[p*2+1].sum)%p;
	t[p].mul=1;
	return;
	
}
void add(long long x){
	if(t[x].add){
		t[x*2].sum=(t[x*2].sum*t[x].mul+t[x].add*(t[x*2].r-t[x*2].l+1))%p;
		t[x*2+1].sum=(t[x*2+1].sum*t[x].mul+t[x].add*(t[x*2+1].r-t[x*2+1].l+1))%p;
		t[x*2].mul=(t[x*2].mul*t[x].mul)%p;
		t[x*2+1].mul=(t[x*2+1].mul*t[x].mul)%p;
		t[x*2].add=(t[x*2].add*t[x].mul+t[x].add)%p;
		t[x*2+1].add=(t[x*2+1].add*t[x].mul+t[x].add)%p;
		t[x].mul=1;
		t[x].add=0;
	}
	return;
}
void change2(int i,int l,int r,long long k){	//	*
	if(t[i].l>=l&&t[i].r<=r){
		t[i].sum=(t[i].sum*k)%p;
		t[i].mul=(t[i].mul*k)%p;
		t[i].add=(t[i].add*k)%p;
		return;
	}
	add(i);
	long long mid=(t[i].l+t[i].r)>>1;
	if(l<=mid)change2(i*2,l,r,k);
	if(r>mid)change2(i*2+1,l,r,k);
	t[i].sum=(t[i*2].sum+t[i*2+1].sum)%p;
	return;
}
void change1(int i,int l,int r,long long k){  //	+
	if(t[i].l>=l&&t[i].r<=r){
		t[i].sum=(t[i].sum+(t[i].r-t[i].l+1)*k)%p;
		t[i].add=(t[i].add+k)%p;
		return;
	}
	add(i);
	long long mid=(t[i].l+t[i].r)>>1;
	if(l<=mid)change1(i*2,l,r,k);
	if(r>mid)change1(i*2+1,l,r,k);
	t[i].sum=t[i*2].sum+t[i*2+1].sum;
	return;
}
long long sum(long long p,long long l,long long r){
	if(t[p].l>=l&&t[p].r<=r)return t[p].sum;
	add(p);
	long long mid=(t[p].l+t[p].r)>>1,ans=0;
	if(l<=mid)
		ans+=sum(p*2,l,r);
	if(r>mid)
		ans+=sum(p*2+1,l,r);
	return ans;
}
int main(){
//	freopen("xds.in","r",stdin);
//	freopen("xds.out","w",stdout);
	long long i,j,k,x,y;
	cin>>n>>m>>p;
	for(i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(i=1;i<=m;i++){
		scanf("%lld%lld%lld",&j,&x,&y);
		if(j==1){
			scanf("%lld",&k);
			change2(1,x,y,k);
		}
		if(j==2){
			scanf("%lld",&k);
			change1(1,x,y,k);
		}
		if(j==3)
			cout<<(sum(1,x,y)%p)<<endl;
	}
	return 0;
}
2020/11/24 13:38
加载中...