妹子刚学线段树模板题 30pts 求调
查看原帖
妹子刚学线段树模板题 30pts 求调
556545
_anll_楼主2024/7/11 17:45

rt,只过了 1,3,4,实在看不出来了求助力qwq!

#include<iostream>
#define lc p<<1
#define rc p<<1|1
#define int long long
#define mid (tr[p].l+tr[p].r)/2
using namespace std;
const int N=1e5+5;
struct Tr{
	int l,r,num,laz1,laz2;
}tr[N*6];
int n,mod,q,num[N];
void pushup(int p){
	tr[p].num=(tr[lc].num+tr[rc].num)%mod;
}
void pushdown(int p){
	if(tr[p].laz1!=1){
		tr[lc].laz1=(tr[lc].laz1*tr[p].laz1)%mod;
		tr[rc].laz1=(tr[rc].laz1*tr[p].laz1)%mod;
		tr[lc].laz2=(tr[lc].laz2*tr[p].laz1)%mod;
		tr[rc].laz2=(tr[rc].laz2*tr[p].laz1)%mod;
		tr[lc].num=(tr[lc].num+((tr[p].laz1-1)*tr[lc].num))%mod;
		tr[rc].num=(tr[rc].num+((tr[p].laz1-1)*tr[rc].num))%mod;
		tr[p].laz1=1;
	}
	if(tr[p].laz2){
		tr[lc].laz2=(tr[lc].laz2+tr[p].laz2)%mod;
		tr[rc].laz1=(tr[rc].laz2+tr[p].laz2)%mod;
		tr[lc].num=(tr[lc].num+((tr[lc].r-tr[lc].l+1)*tr[p].laz2))%mod;
		tr[rc].num=(tr[rc].num+((tr[rc].r-tr[rc].l+1)*tr[p].laz2))%mod;
		tr[p].laz2=0;
	}
}
void build(int l,int r,int p){
	tr[p]={l,r,0,1,0};
	if(l==r){tr[p].num=num[l];return;}
	build(l,mid,lc);build(mid+1,r,rc);
	pushup(p);
}
void upd(int l,int r,int p,int a,int op){
	if(l<=tr[p].l&&tr[p].r<=r){
		if(op==1){
			tr[p].num=(tr[p].num+((a-1)*tr[p].num)%mod)%mod;
			tr[p].laz1=(tr[p].laz1*a)%mod;
			tr[p].laz2=(tr[p].laz2*a)%mod;
		}
		else{
			tr[p].num=(tr[p].num+((tr[p].r-tr[p].l+1)*a)%mod)%mod;
			tr[p].laz2=(tr[p].laz2+a)%mod;
		}
		return;
	}
	pushdown(p);
	if(l<=mid) upd(l,r,lc,a,op);
	if(mid<r) upd(l,r,rc,a,op);
	pushup(p);
}
int Find(int l,int r,int p,int an=0){
	pushdown(p);
	if(l<=tr[p].l&&tr[p].r<=r) return tr[p].num;
	if(l<=mid) an=(an+Find(l,r,lc))%mod;
	if(mid<r) an=(an+Find(l,r,rc))%mod;
	return an;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>q>>mod;int op,l,r,k;
	for(int i=1;i<=n;i++) cin>>num[i];
	build(1,n,1);
	while(q--){
		cin>>op>>l>>r;
		if(op==1){
			cin>>k;
			upd(l,r,1,k,1);
		}
		else if(op==2){
			cin>>k;
			upd(l,r,1,k,0);
		}
		else cout<<Find(l,r,1)<<endl;
	}
	return 0;
}
2024/7/11 17:45
加载中...