求条(分块)
查看原帖
求条(分块)
1371790
ljh0727楼主2025/2/8 09:18

就对了#1#3#4

其他全 WA

#2#9#10超时卡常卡掉了

#include<iostream>
#include<cstdio>
#include<cmath>

using namespace std;

const int M=1e5+5;

int a[M],b[350],s,m;

int add_1[350],add_2[350];

inline int read(){
	register int x=0,f=1;
	register char ch=getchar();
	while(!(ch>='0'&&ch<='9')){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48),ch=getchar();}
	return x*f;
}

inline void print(int x){
	if(x<0){putchar('-'),x=-x;}
	if(x>9)print(x/10);
	putchar(x%10+'0');
}

inline void down1(int x){
	if(add_2[x]==0)
		return;
	b[x]=0;
	for(register int i=x*s;i<(x+1)*s;++i){
		a[i]+=add_2[x];
		b[x]+=a[i];
		a[i]%=m;
		b[x]%=m;
	}
	add_2[x]=0;
}

inline void down2(int x){
	if(add_1[x]==1)
		return;
	b[x]=0;
	for(register int i=x*s;i<(x+1)*s;++i){
		a[i]*=add_1[x];
		b[x]+=a[i];
		a[i]%=m;
		b[x]%=m;
	}
	add_1[x]=1;
}

inline void change_1(int l,int r,int k){
	register int k1=l/s,k2=r/s;
	down1(k1);down1(k2);
	if(k1==k2){
		for(register int i=l;i<=r;++i){
			b[k1]+=a[i]*(k-1);
			a[i]*=k;
			a[i]%=m;
			b[k1]%=m;
		}
	}else{
		for(register int i=l;i<(k1+1)*s;++i){
			b[k1]+=a[i]*(k-1);
			a[i]*=k;
			a[i]%=m;
			b[k1]%=m;
		}
		for(register int i=k2*s;i<=r;++i){
			b[k2]+=a[i]*(k-1);
			a[i]*=k;
			a[i]%=m;
			b[k2]%=m;
		}
		for(register int i=k1+1;i<k2;++i){
			b[i]*=k;
			add_1[i]*=k;
			add_2[i]*=k;
			b[i]%=m;
			add_2[i]%=m;
		}
	}
}

inline void change_2(int l,int r,int k){
	register int k1=l/s,k2=r/s;
	down2(k1);down2(k2);
	down1(k1);down1(k2);
	if(k1==k2){
		for(register int i=l;i<=r;++i){
			b[k1]+=k;
			a[i]+=k; 
			a[i]%=m;
			b[k1]%=m;
		}
	}else{
		for(register int i=l;i<(k1+1)*s;++i){
			b[k1]+=k;
			a[i]+=k;
			a[i]%=m;
			b[k1]%=m;
		}
		for(register int i=k2*s;i<=r;++i){
			b[k2]+=k;
			a[i]+=k;
			a[i]%=m;
			b[k2]%=m;
		}
		for(register int i=k1+1;i<k2;++i){
			b[i]+=s*k;
			add_2[i]+=k;
			b[i]%=m;
			add_2[i]%=m;
		} 
	}
}

inline int query(int l,int r){
	register int k1=l/s,k2=r/s,ans=0;
	if(k1==k2){
		for(register int i=l;i<=r;++i){
			a[i]%=m;
			ans+=a[i]*add_1[k1]+add_2[k1];
			ans%=m;
		}
	}else{
		for(register int i=l;i<(k1+1)*s;++i){
			a[i]%=m;
			ans+=a[i]*add_1[k1]+add_2[k1];
			ans%=m;
		}
		for(register int i=k2*s;i<=r;++i){
			a[i]%=m;
			ans+=a[i]*add_1[k2]+add_2[k2];
			ans%=m;
		}
		for(register int i=k1+1;i<k2;++i){
			ans+=b[i];
			ans%=m;
		}
	}
	return ans;
}

int main(){
	
	register int n,q;
	n=read();q=read();m=read();
	
	s=sqrt(n);
	
	for(register int i=0;i<350;++i)
		add_1[i]=1;
	
	for(register int i=1;i<=n;++i){
		a[i]=read();
		b[i/s]+=a[i];
	}
	
	register int op,l,r,k;
	while(q--){
		op=read();
		if(op==1){
			l=read();r=read();k=read();
			change_1(l,r,k);
		}else if(op==2){
			l=read();r=read();k=read();
			change_2(l,r,k);
		}else{
			l=read();r=read();
			print(query(l,r)%m);
			putchar('\n');
		}
	}
	
	return 0;
}

2025/2/8 09:18
加载中...