线段树30pts求调
查看原帖
线段树30pts求调
842917
S_P_A_楼主2024/2/26 21:31
#include<bits/stdc++.h>
#define N 100010
using namespace std;
int n,q,m;
int a[N],t[N<<2],d1[N<<2],d2[N<<2];
int push_up(int a,int  b){
	return 1ll*(a+b)%m;
}
void build(int p,int l,int r){
	if(l==r) {
		t[p]=a[l];
		d1[p]=1; 
		d2[p]=0;
	}
	else{
		int mid = (l+r)>>1;
		build(p<<1,l,mid);
		build(p<<1|1,mid+1,r);
		t[p] = push_up(t[p<<1],t[p<<1|1]);
		d1[p]=1; 
		d2[p]=0;
	}
	return ;
}
void push_down(int p,int l,int r){
	t[p] = (t[p]*d1[p]+d2[p]*(r-l+1))%m;
	d2[p<<1]=(1ll*d2[p<<1]*d1[p]+d2[p])%m,d1[p<<1] = (1ll*d1[p<<1]*d1[p])%m; 
	d2[p<<1|1]=(1ll*d2[p<<1|1]*d1[p]+d2[p])%m,d1[p<<1|1] =(1ll*d1[p<<1|1] *d1[p])%m;
	d1[p]=1,d2[p]=0;
	return;  
}
void chg1(int p,int l,int r,int x,int y,int k){
	push_down(p,l,r);
	if(l==x&&r==y){
		d1[p] = (d1[p]*k)%m;
		d2[p] = (d2[p]*k)%m;
		push_down(p,l,r);
	}
	else{
		int mid = (l+r) >> 1;
		if(y<=mid) {
			chg1(p<<1,l,mid,x,y,k);
			push_down(p<<1|1,mid+1,r); 
		}
		else if(x>=mid+1) {
			chg1(p<<1|1,mid+1,r,x,y,k);
			push_down(p<<1,l,mid);	
		}
		else{
			chg1(p<<1,l,mid,x,mid,k);
			chg1(p<<1|1,mid+1,r,mid+1,y,k) ;
		}
		t[p] = push_up(t[p<<1],t[p<<1|1]);
	}
	return;
}
void chg2(int p,int l,int r,int x,int y,int k){
	push_down(p,l,r);
	if(l==x&&r==y){
		d2[p] = (d2[p]+k)%m;
		push_down(p,l,r);
	}
	else{
		int mid = (l+r) >> 1;
		if(y<=mid) {
			chg2(p<<1,l,mid,x,y,k);
			push_down(p<<1|1,mid+1,r); 
		}
		else if(x>=mid+1) {
			chg2(p<<1|1,mid+1,r,x,y,k);
			push_down(p<<1,l,mid);
		}
		else{
			chg2(p<<1,l,mid,x,mid,k);
			chg2(p<<1|1,mid+1,r,mid+1,y,k) ;
		}
		t[p] = push_up(t[p<<1],t[p<<1|1]);
	}
	
	return;
}
int query(int p,int l,int r,int x,int y){
	push_down(p,l,r);
	if(l==x&&r==y){
		return t[p]%m;
	} 
	else{
		int mid = (l+r)>>1;
		if(y<=mid) return query(p<<1,l,mid,x,y);
		else if(x>=mid+1) return query(p<<1|1,mid+1,r,x,y);
		else{
			return (query(p<<1,l,mid,x,mid)+query(p<<1|1,mid+1,r,mid+1,y))%m;
		}
	}
}
int main()
{
	cin >> n >> q >> m;
	for(int i=1;i<=n;i++) cin >> a[i];
	build(1,1,n);
	for(int i=1;i<=q;i++){
		int op;
		cin >> op;
		if(op==1) {
			int x,y,k;
			cin >> x >> y >> k;
			chg1(1,1,n,x,y,k);
		}
		if(op==2){
			int x,y,k;
			cin >> x >> y >> k;
			chg2(1,1,n,x,y,k);
		}
		if(op==3){
			int x,y;
			cin >> x >> y;
			cout << query(1,1,n,x,y) << endl;
		}
	}
	return 0;
}

https://www.luogu.com.cn/record/148463956

2024/2/26 21:31
加载中...