全wa求助
查看原帖
全wa求助
1164451
yanzhouXZX楼主2024/7/12 21:04
#include<bits/stdc++.h>
using namespace std;
long long a[1000001],b,c,d,e,n,m,k[1000001],tr[1000001],lazy[1000001],lazy1[1000001],inf=-0x3f3f3f3f,Q;
void build(long long l,long long r,long long p) {
	lazy1[p]=1;
	if(l==r) {
		tr[p]=a[l];
		return ;
	}
	long long mid=(l+r)/2;
	build(l,mid,2*p);
	build(mid+1,r,2*p+1);
	tr[p]=tr[2*p]+tr[2*p+1];
	return ;
}
void push_down(long long x,int l,int r) {
	tr[2*x]*=lazy1[x];
	tr[2*x+1]*=lazy1[x];
	int mid=(l+r)/2;
	tr[2*x]+=lazy[x]*(mid-l+1);
	tr[2*x+1]+=lazy[x]*(r-mid);
	lazy1[2*x]*=lazy1[x];
	lazy1[2*x+1]*=lazy1[x];
	lazy[2*x]+=lazy[x];
	lazy[2*x+1]+=lazy[x];
	tr[2*x]%=Q;
	tr[2*x+1]%=Q;
	lazy1[2*x]%=Q;
	lazy1[2*x+1]%=Q;
	lazy[2*x]%=Q;
	lazy[2*x+1]%=Q;
	lazy[x]=0;
	lazy1[x]=1;
	return ;
}
int check(long long l,long long r,long long s,long long t,long long x) {
	if(lazy[x]||lazy1[x]) push_down(x,s,t);
//	cout<<x<<" ";
//	if(l==r)return tr[x]
	if(r<s||l>t) return inf;
	if(l<=s&&t<=r) return tr[x];
	int ans=0;
	int mid=(s+t)/2;
	if(l<=mid) ans+=check(l,r,s,mid,x*2);
	if(mid+1<=r) ans+=check(l,r,mid+1,t,x*2+1);
	return ans%Q;
}
void add(long long l,long long r,long long s,long long t,long long x,long long v) {
	if(r<s||t<l) return ;
	if(l<=s&&t<=r) {
//		cout<<s<<" "<<t<<endl;
		tr[x]+=v*(s-t+1);
		lazy[x]+=v;
		push_down(x,s,t);
		return;
	}
	if(lazy[x]||lazy1[x]) push_down(x,s,t);
	long long mid=(s+t)/2;
	if(l<=mid) add(l,r,s,mid,x*2,v);
	if(mid+1<=r) add(l,r,mid+1,t,x*2+1,v);
	tr[x]=tr[x*2]+tr[x*2+1];
}
void ch(long long l,long long r,long long s,long long t,long long x,long long v) {
	if(lazy[x]) push_down(x,s,t);
	if(r<s||t<l) return ;
	if(l<=s&&t<=r) {
		tr[x]*=v;
		lazy1[x]*=v;
		lazy[x]*=v;
		push_down(x,s,t);
		tr[x]%=Q;
		lazy1[x]%=Q;
		lazy[x]%=Q;
		return;
	}
	long long mid=(s+t)/2;
	if(l<=mid) ch(l,r,s,mid,x*2,v);
	if(mid+1<=r) ch(l,r,mid+1,t,x*2+1,v);
	tr[x]=tr[x*2]+tr[x*2+1];
}
int main() {
	cin>>n>>m>>Q;
	for(long long i=1; i<=n; i++)
		cin>>a[i];
	build(1,n,1);
//	cin>>m;
	for(long long i=1; i<=m; i++) {
 		cin>>b;
		if(b==1) {
			scanf("%lld%lld%lld",&c,&d,&e);
			ch(c,d,1,n,1,e);
		}
		if(b==2) {
			scanf("%lld%lld%lld",&c,&d,&e);
			add(c,d,1,n,1,e);
		}
		if(b==3) {
			scanf("%lld%lld",&c,&d);
			cout<<check(c,d,1,n,1)<<endl;
		}
	}
	for(int i=1; i<=n; i++) {
		cout<<check(i,i,1,n,1)<<" ";
	}
	cout<<endl;
	for(int i=1; i<=2*n-1; i++) {
		cout<<tr[i]<<" ";
	}
}
2024/7/12 21:04
加载中...