30分求调,真的谢谢了!
查看原帖
30分求调,真的谢谢了!
344644
SUPERZGY楼主2023/8/25 16:19

flag1乘flag2加

#include<iostream>
using namespace std;
struct node{
	long long fa,l,r,sum,flag1,flag2;
}tree[400005];
long long n,q,m,op,a[100005];
void build(long long fa,long long l,long long r){
	tree[fa].l=l;tree[fa].r=r;tree[fa].flag1=1;
	if(l==r) {
		tree[fa].sum=a[l]%m;
		return;
	}
	long long mid=(l+r)/2;
	build(fa*2,l,mid);
	build(fa*2+1,mid+1,r);
	tree[fa].sum=(tree[fa*2].sum+tree[fa*2+1].sum)%m;
	return;
}          
void down(long long fa){
	tree[fa*2].sum=tree[fa*2].sum*tree[fa].flag1+tree[fa].flag2*(tree[fa*2].r-tree[fa*2].l+1);
	tree[fa*2+1].sum=tree[fa*2+1].sum*tree[fa].flag1+tree[fa].flag2*(tree[fa*2+1].r-tree[fa*2+1].l+1);
	tree[fa*2].flag1*=tree[fa].flag1;
	tree[fa*2].flag2=tree[fa*2].flag2*tree[fa].flag1+tree[fa].flag2;
	tree[fa*2+1].flag1*=tree[fa].flag1;
	tree[fa*2+1].flag2=tree[fa*2+1].flag2*tree[fa].flag1+tree[fa].flag2;
	tree[fa].flag1=1;tree[fa].flag2=0;
	tree[fa*2].sum%=m;tree[fa*2+1].sum%=m;
	tree[fa*2].flag1%=m;tree[fa*2+1].flag1%=m;
	return;
}
void add1(long long fa,long long l,long long r,long long k){
	if(tree[fa].l>=l&&tree[fa].r<=r){
		tree[fa].flag1=(tree[fa].flag1*k)%m;
		tree[fa].flag2*=k;
		tree[fa].sum=(tree[fa].sum*k)%m;
		return;
	}
	if(tree[fa].flag1!=1||tree[fa].flag2!=0) down(fa);
	long long mid=(tree[fa].r+tree[fa].l)/2;
	if(mid>=l) add1(fa*2,l,r,k);
	if(mid<r) add1(fa*2+1,l,r,k);
	tree[fa].sum=tree[fa*2].sum+tree[fa*2+1].sum;
	tree[fa].sum%=m;
	return;
}
void add2(long long fa,long long l,long long r,long long k){
	if(tree[fa].l>=l&&tree[fa].r<=r){
		tree[fa].flag2+=k;
		tree[fa].sum+=(tree[fa].r-tree[fa].l+1)*k;
		tree[fa].sum%=m;
		return;
	}
	if(tree[fa].flag1!=1||tree[fa].flag2!=0) down(fa);
	long long mid=(tree[fa].r+tree[fa].l)/2;
	if(mid>=l) add2(fa*2,l,r,k);
	if(mid<r) add2(fa*2+1,l,r,k);
	tree[fa].sum=tree[fa*2].sum+tree[fa*2+1].sum;
	tree[fa].sum%=m;
	return;
}
long long ask(long long fa,long long l,long long r){
	if(tree[fa].l>=l&&tree[fa].r<=r) return tree[fa].sum;
	if(tree[fa].flag1!=1||tree[fa].flag2!=0) down(fa);
	long long mid=(tree[fa].r+tree[fa].l)/2;
	long long ans=0;
	if(mid>=l) ans+=ask(fa*2,l,r);
	if(mid<r) ans+=ask(fa*2+1,l,r);
	ans=ans%m;
	return ans;
}
int main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	build(1,1,n);
		for (int i=1;i<=q;i++){
			cin>>op;
			long long l,r,k;
			if(op==1){
				cin>>l>>r>>k;
				add1(1,l,r,k);
			}
			else if(op==2){
				cin>>l>>r>>k;
				add2(1,l,r,k);
			} 
			else {
				cin>>l>>r;
				cout<<ask(1,l,r)<<endl;
			}
		}
	return 0;
}
2023/8/25 16:19
加载中...