蒟蒻刚学线段树。。。。样例过了但0分
查看原帖
蒟蒻刚学线段树。。。。样例过了但0分
388414
comcopy楼主2022/11/15 19:59

RT求调

大佬救我!!!!

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int mod;

int a[N];

struct fyn{
	int b[N<<1],l[N<<1],r[N<<1];
	int tag[N<<1],time[N<<1];
	int cnt;
	inline int newnode(){++cnt;b[cnt]=0;l[cnt]=r[cnt]=0;tag[cnt]=0;time[cnt]=1;return cnt;}
	
	inline void build(int nl,int nr,int now){
		if(nl==nr){
			b[now]=a[nl];
			return;
		}
		int mid((nr-nl>>1)+nl);
		build(nl,mid,l[now]=newnode());
		build(mid+1,nr,r[now]=newnode());
		b[now]=b[l[now]]+b[r[now]];
		return;
	}
	
	inline void pushdown(int nl,int nr,int now){
		int mid=((nr-nl>>1)+nl);
		
		b[l[now]]*=time[now];
		b[l[now]]%=mod;
		b[r[now]]*=time[now];
		b[r[now]]%=mod;
		time[l[now]]*=time[now];
		time[l[now]]%=mod;
		time[r[now]]*=time[now];
		time[r[now]]%=mod;
		time[now]=1;
		
		b[l[now]]+=tag[now]*(mid-nl+1);
		b[l[now]]%=mod;	
		b[r[now]]+=tag[now]*(nr-mid);
		b[r[now]]%=mod;
		tag[l[now]]+=tag[now];
		tag[l[now]]%=mod;
		tag[r[now]]+=tag[now];
		tag[r[now]]%=mod;
		tag[now]=0;
		return;
	}
	
	inline void pushup(int now){
		b[now]=b[l[now]]+b[r[now]];
		b[now]%=mod;
	} 
	
	inline void add(int wl,int wr,int nl,int nr,int now,int c){
		if(wl<=nl && nr<=wr){
			b[now]+=c*(nr-nl+1);
			tag[now]+=c;
			b[now]%=mod;
			return;
		}
		pushdown(nl,nr,now);
		int mid((nr-nl>>1)+nl);
		if(wl<=mid)add(wl,wr,nl,mid,l[now],c);
		if(mid<wr)add(wl,wr,mid+1,nr,r[now],c);
		pushup(now);
		return;
	}
	
	inline void adtime(int wl,int wr,int nl,int nr,int now,int c){
		if(wl<=nl&&nr<=wr){
			pushdown(nl,nr,now);
			b[now]*=c;
			b[now]%=mod;
			time[now]*=c;
			time[now]%=mod;
			return;
		}
		pushdown(nl,nr,now);
		int mid((nr-nl>>1)+nl);
		if(wl<=mid)adtime(wl,wr,nl,mid,l[now],c);
		if(mid<wr)adtime(wl,wr,mid+1,nr,r[now],c);
		pushup(now);
		return;
	}
	
	inline int query(int wl,int wr,int nl,int nr,int now){
		if(wl<=nl && nr<=wr){
			pushdown(nl,nr,now);
			return b[now]%mod;
		}
		pushdown(nl,nr,now);
		int mid((nr-nl>>1)+nl);
		int ans=0;
		if(wl<=mid)ans+=query(wl,wr,nl,mid,l[now])%mod,ans%=mod;
		if(mid<wr)ans+=query(wl,wr,mid+1,nr,r[now])%mod,ans%=mod;
		return ans%mod;
	}
	
	inline void print(int nl,int nr,int now){
		cout<<nl<<' '<<nr<<' '<<b[now]<<' '<<tag[now]<<endl;
		if(nl==nr)return;
		int mid((nr-nl>>1)+nl);
		print(nl,mid,l[now]);
		print(mid+1,nr,r[now]);
	}
	
	
}glove;

int n,m;
int rt;
signed main(){
	cin>>n>>m>>mod;
	for(int i=1;i<=n;++i){
		cin>>a[i];
		a[i]%=mod;
	}
	glove.build(1,n,rt=glove.newnode());
	for(int i=1;i<=n;++i){
		int op,x,y,c;
		cin>>op>>x>>y;
		if(op==3){
			cout<<glove.query(x,y,1,n,rt)%(mod)<<endl;
		}else{
			cin>>c;
			if(op==2)
			glove.add(x,y,1,n,rt,c);
			else
			glove.adtime(x,y,1,n,rt,c);
		}
//		cout<<endl<<"____"<<endl;
//		glove.print(1,n,1);
//		cout<<"----"<<endl;
	}
	return(0-0);
}
2022/11/15 19:59
加载中...