线段树该取模的都取了仍然60求助
查看原帖
线段树该取模的都取了仍然60求助
553192
Revitalize楼主2024/7/30 13:59
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N=400005;
class SegmentTree{
	private:
		int d[N],tag1[N],tag2[N],cnt,ls[N],rs[N],q;
		inline void pushup(int &p) {
			d[p]=(d[ls[p]]%q+d[rs[p]]%q)%q;
			d[p]%=q;
		}
		inline void pushdown(int s,int t,int m,int p){
			if(!ls[p]) ls[p]=++cnt;
			if(!rs[p]) rs[p]=++cnt;
			if(tag2[p]!=1){
				tag2[ls[p]]*=tag2[p]%q;
				tag2[rs[p]]*=tag2[p]%q;
				tag2[ls[p]]%=q;
				tag2[rs[p]]%=q;
				tag1[ls[p]]*=tag2[p]%q;
				tag1[rs[p]]*=tag2[p]%q;
				tag1[ls[p]]%=q;
				tag1[rs[p]]%=q;
				d[ls[p]]*=tag2[p]%q;
				d[rs[p]]*=tag2[p]%q;
				d[ls[p]]%=q;
				d[rs[p]]%=q;
				tag2[p]=1;
			}
			if(tag1[p]){
				tag1[ls[p]]+=tag1[p]%q;
				tag1[rs[p]]+=tag1[p]%q;
				tag1[ls[p]]%=q;
				tag1[rs[p]]%=q;
				d[ls[p]]+=tag1[p]%q*((m-s+1)%q)%q;
				d[rs[p]]+=tag1[p]%q*((t-m)%q)%q;
				d[ls[p]]%=q;
				d[rs[p]]%=q;
				tag1[p]=0;
			}
		}
		int query(int l,int r,int s,int t,int p){
			if(!p) return 0;
			if(l<=s&&t<=r) return d[p]%q;
			int mid=s+((t-s)>>1),S=0;
			pushdown(s,t,mid,p);
			if(l<=mid){
				S+=query(l,r,s,mid,ls[p]);
				S%=q;
			}
			if(r>mid){
				S+=query(l,r,mid+1,t,rs[p]);
				S%=q;
			}
			return S;
		}
		void add(int l,int r,int c,int s,int t,int &p){
			if(!p) p=++cnt;
			if(l<=s&&t<=r){
				d[p]+=(t-s+1)*c%q;
				d[p]%=q;
				tag1[p]+=c%q;
				tag1[p]%=q;
				return ;
			}
			int mid=s+((t-s)>>1);
			pushdown(s,t,mid,p);
			if(l<=mid) add(l,r,c,s,mid,ls[p]);
			if(r>mid) add(l,r,c,mid+1,t,rs[p]);
			pushup(p);
		}
		void mul(int l,int r,int c,int s,int t,int &p){
			if(!p) p=++cnt;
			if(l<=s&&t<=r){
				d[p]*=c%q;
				d[p]%=q;
				tag2[p]*=c%q;
				tag1[p]*=c%q;
				tag2[p]%=q;
				tag1[p]%=q;
				return ;
			}
			int mid=s+((t-s)>>1);
			if(tag1[p]||tag2[p]) pushdown(s,t,mid,p);
			if(l<=mid) mul(l,r,c,s,mid,ls[p]);
			if(r>mid) mul(l,r,c,mid+1,t,rs[p]);
			pushup(p);
		}
	public:
		SegmentTree(){
			cnt=1;
			for(int i=1;i<N;i++) tag2[i]=1;
		}
		inline void fun(int n,int m){
			cin>>n>>q;
			for(int i=1;i<=n;i++){
				int tmp=1,x;
				cin>>x;
				add(i,i,x,1,n,tmp);
			}
			cin>>m;
			for(int i=1;i<=m;i++){
				int op;
				cin>>op;
				if(op==2){
					int x,y,z,tmp=1;
					cin>>x>>y>>z;
					add(x,y,z,1,n,tmp);
				}else if(op==1){
					int x,y,z,tmp=1;
					cin>>x>>y>>z;
					mul(x,y,z,1,n,tmp);	
				}else{
					int x,y;
					cin>>x>>y;
					cout<<query(x,y,1,n,1)%q<<endl;
				}
			}
		}	
}st;
int n,m;
signed main(){
	ios::sync_with_stdio(false);
	st.fun(n,m);
	return 0;
} 
2024/7/30 13:59
加载中...