救救孩子吧www
查看原帖
救救孩子吧www
110559
Arron_HC楼主2021/5/7 21:20

输出结果恒为零

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005;
int n,m,PP; 

int a[N],d[N*4],b1[N*4],b2[N*4];

int sum(int a,int b){
	return (a+b)%PP;
}
int mul(int a,int b){
	return (a*b)%PP;
}
void pushup(int p){
	d[p]=sum(d[p*2],d[p*2+1]);
}
void pushdown(int p,int lenl,int lenr)
{
	if(b1[p]!=1){
		b1[p*2]=mul(b1[p*2],b1[p]);
		b1[p*2+1]=mul(b1[p*2+1],b1[p]);
		b2[p*2]=mul(b2[p*2],b1[p]);
		b2[p*2+1]=mul(b2[p*2+1],b1[p]);
		d[p*2]=mul(d[p*2],b1[p]);
		d[p*2+1]=mul(d[p*2+1],b1[p]);
		b1[p]=1;
	}
	if(b2[p])
	{
		b2[p*2]=sum(b2[p*2],b2[p]);
		b2[p*2+1]=sum(b2[p*2+1],b2[p]);
		d[p*2]=sum(d[p*2],b2[p]*lenl);
		d[p*2+1]=sum(d[p*2+1],b2[p]*lenr);
		b2[p]=0;
	}
	return ;
}
void build(int l,int r,int p)
{
	if(l==r){
		d[p]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	pushup(p);
}
void update1(int l,int r,int ql,int qr,int k,int p)
{
	if(ql<=l&&qr>=r){
		d[p]=mul(d[p],k);
		b1[p]=mul(b1[p],k);
		b2[p]=mul(b2[p],k);
		return ;
	}
	int mid=(l+r)/2;
	pushdown(p,mid-l+1,r-mid);
	if(mid<=l) update1(l,mid,ql,qr,k,p*2);
	if(mid>r)  update1(mid+1,r,ql,qr,k,p*2+1);
	pushup(p);
}
void update2(int l,int r,int ql,int qr,int k,int p)
{
	if(ql<=l&&qr>=r){
		d[p]=sum(d[p],k*(r-l+1));
		b2[p]=sum(b2[p],k);
		return ;
	}
	int mid=(l+r)/2;
	pushdown(p,mid-l+1,r-mid);
	if(mid<=l) update2(l,mid,ql,qr,k,p*2);
	if(mid>r)  update2(mid+1,r,ql,qr,k,p*2+1);
	pushup(p);
}
int ask(int l,int r,int ql,int qr,int p)
{
	if(ql<=l&&qr>=r) return d[p];
	int mid=(l+r)/2;
	pushdown(p,mid-l+1,r-mid);
	int ans=0;
	if(mid<=l) ans=sum(ans,ask(l,mid,ql,qr,p*2));
	if(mid>r)  ans=sum(ans,ask(mid+1,r,ql,qr,p*2+1));
	return ans;
}
signed main()
{
	memset(b1,1,sizeof(b1));
	cin>>n>>m>>PP;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;
			cin>>x>>y>>k;
			update1(1,n,x,y,k,1);
		}
		else if(op==2){
			int x,y,k;
			cin>>x>>y>>k;
			update2(1,n,x,y,k,1);
		}
		else if(op==3){
			int x,y;
			cin>>x>>y;
			cout<<ask(1,n,x,y,1)<<endl;
		}
	}
	for(int i=1;i<=4*n;i++)
	cout<<d[i]<<endl;
	return 0;
}
2021/5/7 21:20
加载中...