分块求条,#134对了
查看原帖
分块求条,#134对了
1353330
K_J_M楼主2024/7/21 19:53
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+10;
const int M = sqrt(1e7+10);
int n,q,m,op,x,y,k;
int a[N],belong[N],len,num;
struct node{
	int l,r,sum,add,mul;
}b[M];
void build(){
	num=sqrt(n);
	len=sqrt(n);
	for(int i=1;i<=num;i++){
		b[i].l=(i-1)*len+1,b[i].r=i*len;
	}
	if(len*num<n){
		num++;
		b[num].l=b[num-1].r+1;
		b[num].r=n;
	}
	for(int i=1;i<=num;i++){
		for(int j=b[i].l;j<=b[i].r;j++){
			b[i].sum+=a[j];
			belong[j]=i;
		}
	}
	for(int i=1;i<=num;i++) b[i].mul=1;
}
void update_1(int x,int y,int k){//x到y区间乘k
	int p=belong[x],q=belong[y];
	if(p==q){
	 	for(int i=x;i<=y;i++){
	 		b[p].sum+=(k-1)*a[i];b[p].sum%=m;
			a[i]*=k;a[i]%=m;
		}
	}else{
		for(int i=x;i<=b[p].r;i++){
			b[p].sum+=(k-1)*a[i];b[p].sum%=m;
			a[i]*=k;a[i]%=m;
		}
		for(int i=p+1;i<q;i++){
			b[i].sum*=k;b[i].add*=k,b[i].mul+=k;
		}
		for(int i=b[q].l;i<=y;i++){
			b[q].sum+=(k-1)*a[i];b[q].sum%=m;
			a[i]*=k;a[i]%=m;
		}
	}
}
void update_2(int x,int y,int k){
	int p=belong[x],q=belong[y];
	if(p==q){
		for(int i=x;i<=y;i++){
			a[i]+=k;b[i].sum+=k;
			a[i]%=m;b[i].sum%=m;
		}
	}else{
		for(int i=x;i<=b[p].r;i++){
			a[i]+=k;b[p].sum+=k;
			a[i]%=m;b[p].sum%=m;
		}
		for(int i=p+1;i<q;i++){
			b[i].sum+=len*k,b[i].add+=k;
			b[i].sum%=m,b[i].add%=m;
		}
		for(int i=b[q].l;i<=y;i++){
			a[i]+=k;b[q].sum+=k;
			a[i]%=m;b[q].sum%=m;
		}
	}
}
int getsum(int x,int y){
	int p=belong[x],q=belong[y],ans=0;
	if(p==q){
		for(int i=x;i<=y;i++){
			ans+=(a[i]*b[p].mul)%m+b[p].add;
			ans%=m;
		}
		return ans;
	}else{
		for(int i=x;i<=b[p].r;i++){
			ans+=(a[i]*b[p].mul)%m+b[p].add;
			ans%=m; 
		}
		for(int i=p+1;i<q;i++){
			ans+=b[i].sum;
			ans%=m;
		}
		for(int i=b[q].l;i<=y;i++){
			ans+=(a[i]*b[q].mul)%m+b[p].add;
			ans%=m;
		}
		return ans;
	}
}
signed main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build();
	while(q--){
		cin>>op>>x>>y;
		if(op==1){
			cin>>k;
			update_1(x,y,k);
		}else{
			if(op==2){
				cin>>k;
				update_2(x,y,k);
			}else{
				cout<<getsum(x,y)<<endl;
			}
		}
	}
	return 0;
} 
2024/7/21 19:53
加载中...