寄
查看原帖
寄
917775
_buzhidao_楼主2024/4/10 06:46

record

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define read(x) cin>>x
template<typename T>inline void read(T &x){
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	x*=f;
}
int n,q,m,a,b,c,d;ll s[(int)4e5];
struct tree{
	int l,r;ll va,tag1,tag2; 
} t[(int)4e5+5];
void buildt(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].va=s[l]%m;return;
	}
	int mid=(l+r)>>1;
	buildt(p*2,l,mid);
	buildt(p*2+1,mid+1,r);
	t[p].va=(t[p*2].va+t[p*2+1].va)%m;
}
void spread(int p){
	ll tmp;
	if(t[p].tag1){
		tmp=t[p].tag1;
		t[p*2].va=(t[p*2].va+tmp*(t[p*2].r-t[p*2].l+1))%m;
		t[p*2+1].va=(t[p*2+1].va+tmp*(t[p*2+1].r-t[p*2+1].l+1))%m;
		t[p*2].tag1=(t[p*2].tag1+tmp)%m;t[p*2+1].tag1=(t[p*2+1].tag1+tmp)%m;
		t[p].tag1=0;
	}
	if(t[p].tag2){
		tmp=t[p].tag2;
		t[p*2].va=(t[p*2].va*tmp)%m;
		t[p*2+1].va=(t[p*2+1].va*tmp)%m;
		t[p*2].tag2=(t[p*2].tag2*tmp)%m;t[p*2+1].tag2=(t[p*2+1].tag2*tmp)%m;
		t[p].tag2=0;
	}
}
void upd1(int p,int l,int r,int k){
	if(t[p].l>=l&&t[p].r<=r){
		t[p].va=(t[p].va+(ll)k*(t[p].r-t[p].l+1))%m;
		t[p].tag1=(t[p].tag1+k)%m;
		return;
	}
	spread(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) upd1(p*2,l,r,k);
	if(r>mid) upd1(p*2+1,l,r,k);
	t[p].va=(t[p*2].va+t[p*2+1].va)%m;
}
void upd2(int p,int l,int r,int k){//bug
	if(t[p].l>=l&&t[p].r<=r){
		t[p].va=(t[p].va*k)%m;
		t[p].tag2=(t[p].tag2*k)%m;
		return;
	}
	spread(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) upd2(p*2,l,r,k);
	if(r>mid) upd2(p*2+1,l,r,k);
	t[p].va=(t[p*2].va+t[p*2+1].va)%m;
}
ll query(int p,int l,int r){
	if(l<=t[p].l&&r>=t[p].r){/*cout<<t[p].l<<t[p].r<<' ';*/return t[p].va;}
	spread(p);
	int mid=(t[p].l+t[p].r)>>1;ll ans=0;
	if(l<=mid) ans+=query(p*2,l,r);
	if(r>mid) ans+=query(p*2+1,l,r);
	return ans; 
}
int main(){
	read(n);read(q);read(m);
	for(int i=1;i<=n;++i) read(s[i]);
	buildt(1,1,n);
	for(int i=0;i<q;++i){
		read(a);
		if(a==1){
			read(b);read(c);read(d);
			upd2(1,b,c,d);
		}
		else if(a==2){
			read(b);read(c);read(d);
			upd1(1,b,c,d);
		}
		else if(a==3){
			read(b);read(c);
			cout<<query(1,b,c)%m<<endl;
		}
		//if(i==1) for(int i=1;i<=4*n;++i) if(t[i].va!=0) cout<<t[i].va<<' '<<t[i].l<<' '<<t[i].r<<endl;
		/*for(int i=1;i<=n;++i){
		    cout<<query(1,i,i)<<' ';
		}cout<<endl;*/
	}
	return 0;
}

样例是通过的,但交上去爆零。
orz求助巨佬!

2024/4/10 06:46
加载中...