全wa求调
查看原帖
全wa求调
1003873
PUTONGDEYITIREN楼主2025/2/6 20:26
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e5+10;
ll a[N],tree[N<<2],tag[N<<2],tag1[N<<2],kk;
ll ls(ll p){return p*2;}
ll rs(ll p){return p*2+1;}
void push_up(ll p){tree[p]=tree[ls(p)]+tree[rs(p)];}
void build(ll p,ll pl,ll pr){
	if(pl==pr){tree[p]=a[pl];return;}
	ll mid=(pl+pr)/2;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
void addtag(ll p,ll pl,ll pr,ll d,ll d1){
	tag[p]+=d1;tag1[p]*=d;
	tag[p]%=kk;tag1[p]%=kk;
	tree[p]*=d;
	tree[p]%=kk;
	tree[p]+=(pr-pl+1)*d1;
	tree[p]%=kk;
}
void push_down(ll p,ll pl,ll pr){
	ll mid=(pl+pr)/2;
	addtag(ls(p),pl,mid,tag1[p],tag[p]);
	addtag(rs(p),mid+1,pr,tag1[p],tag[p]);
	tag1[p]=1;tag[p]=0;
}
void update(ll l,ll r,ll p,ll pl,ll pr,ll d){
	if(pl>=l&&pr<=r){
		addtag(p,pl,pr,1,d);
		return;
	}
	push_down(p,pl,pr);
	ll mid=(pl+pr)/2;
	if(l<=mid) update(l,r,ls(p),pl,mid,d);
	if(r>mid) update(l,r,rs(p),mid+1,pr,d);
	push_up(p);
	return;
} 
void update1(ll l,ll r,ll p,ll pl,ll pr,ll d){
	if(pl>=l&&pr<=r){
		addtag(p,pl,pr,d,0);
		return;
	}
	push_down(p,pl,pr);
	ll mid=(pl+pr)/2;
	if(l<=mid) update1(l,r,ls(p),pl,mid,d);
	if(r>mid) update1(l,r,rs(p),mid+1,pr,d);
	push_up(p);
	return;
} 
ll query(ll l,ll r,ll p,ll pl,ll pr){
	if(pl>=l&&pr<=r) return tree[p];
	push_down(p,pl,pr);
	ll mid=(pl+pr)/2,res=0;
	if(l<=mid) res+=query(l,r,ls(p),pl,mid);
	res%=kk;
	if(r>mid) res+=query(l,r,rs(p),mid+1,pr);
	return res%kk;
	
}
int main(){
	//ios::sync_with_stdio(0);
	ll n,m,x,l,r,d;
	cin>>n>>m>>kk;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=(n<<2);i++) tag1[i]=1;
	build(1,1,n);
	//for(int i=1;i<=(n<<2)+1;i++) cout<<tree[i]<<" ";
	//cout<<endl;
	while(m--){
		cin>>x;
		if(x==1){
			cin>>l>>r>>d;
			update1(l,r,1,1,n,d);
		}
		if(x==2){
			cin>>l>>r>>d;
			update(l,r,1,1,n,d);
		}
		if(x==3){
			cin>>l>>r;		
			cout<<query(l,r,1,1,n)<<"\n";
		}
		//for(int i=1;i<=(n<<2)+1;i++) cout<<tree[i]<<" ";
		//cout<<endl; 
	}
	return 0;
}

2025/2/6 20:26
加载中...