线段树求调,悬关
查看原帖
线段树求调,悬关
1260861
Lmx120815楼主2025/6/30 22:47

觉得写得没什么问题,可是过不了样例。
码风良好。

#include <bits/stdc++.h>
#define int long long
#define ll long long
#define ull unsigned long long
#define inf 2147483647
#define eps 1e-9
#define endl "\n"
#define il inline
using namespace std;
const int N=1e5+5,M=5e5+5;
inline int read(){
    int x(0),f(1);char c=getchar();
    while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
int n,m,a[N],t,mod;
struct segment_tree{
#define root 1,1,n
#define ls (pos<<1)
#define rs (ls|1)
#define mid ((l+r)>>1)
#define l_son ls,l,mid
#define r_son rs,mid+1,r
#define This pos,l,r
	int data[N<<2],tag[N<<2],tag2[N<<2];
	void upd(int pos){
		data[pos]=data[ls]+data[rs];
		data[pos]%=mod;
		return ;
	}
	void build(int pos,int l,int r){
		tag2[pos]=1;
		if(l==r){
			data[pos]=a[l];
			data[pos]%=mod;
			return;
		}
		build(l_son),build(r_son),upd(pos);
		return ;
	}
	void stg(int pos,int l,int r,int v){
		data[pos]+=v*(r-l+1);
		data[pos]%=mod;
		tag[pos]+=v;
		tag[pos]%=mod;
		return ;
	}
	void stg2(int pos,int l,int r,int v){
		tag[pos]*=v;
		tag[pos]%=mod;
		tag2[pos]*=v;
		tag2[pos]%=mod;
		data[pos]*=v;
		data[pos]%=mod;
		return ;
	}
	void psd(int pos,int l,int r){
		if(tag2[pos]!=1){
			tag2[ls]*=tag2[pos];
			tag2[ls]%=mod;
			tag2[rs]*=tag2[pos];
			tag2[rs]%=mod;
			tag[ls]*=tag2[pos];
			tag[ls]%=mod;
			tag[rs]*=tag2[pos];
			tag[rs]%=mod;
			data[ls]*=tag2[pos];
			data[ls]%=mod;
			data[rs]*=tag2[pos];
			data[rs]%=mod;
			tag2[pos]=1;
		}
		if(tag[pos]){
			tag[ls]+=tag[pos];
			tag[ls]%=mod;
			tag[rs]+=tag[pos];
			tag[rs]%=mod;
			data[ls]+=tag[pos];
			data[ls]%=mod;
			data[rs]+=tag[pos];
			data[rs]%=mod;
			tag[pos]=0;
		}
		return ;
	}
	void update(int pos,int l,int r,int L,int R,int v){
		if(L<=l && r<=R){
			stg(This,v);
			return;
		}
		psd(This);
		if(L<=mid) update(l_son,L,R,v);
		if(R>=mid+1) update(r_son,L,R,v);
		upd(pos);
		return ;
	}
	void update2(int pos,int l,int r,int L,int R,int v){
		if(L<=l && r<=R){
			stg2(This,v);
			return;
		}
		psd(This);
		if(L<=mid) update(l_son,L,R,v);
		if(R>=mid+1) update(r_son,L,R,v);
		upd(pos);
		return ;
	}
	int qry(int pos,int l,int r,int L,int R){
		if(L<=l && r<=R) return data[pos]%mod;
		psd(This);
		int res=0;
		if(L<=mid) res+=qry(ls,l,mid,L,R);
		res%=mod;
		if(R>mid) res+=qry(rs,mid+1,r,L,R);
		return res%mod;
	}
}T;
signed main(){
	scanf("%lld %lld %lld",&n,&m,&mod);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	T.build(root);
	while(m--){
		int op,x,y,k;
		scanf("%lld %lld %lld",&op,&x,&y);
		if(op==1){
			scanf("%lld",&k);
//			printf("op:%lld\n",T.qry(root,x,y));
			T.update2(root,x,y,k);
//			printf("op:%lld\n",T.qry(root,x,y));
		}
		else if(op==2){
			scanf("%lld",&k);
			T.update(root,x,y,k);
		}
		else printf("%lld\n",T.qry(root,x,y)%mod);
	}
	return 0;
}
2025/6/30 22:47
加载中...