求助
查看原帖
求助
1371790
ljh0727楼主2025/1/31 10:15

刚学,思路混乱加码风乱。

样例可以过,但 wa 的一分不得。

求条。

#include<iostream>
#include<cstdio>

#define lp p<<1
#define rp p<<1|1
#define mid l+(r-l)/2

using namespace std;

const int M=1e5+5;

int a[M];

int t[M<<2],add_1[M<<2],add_2[M<<2];

void build(int l,int r,int p){
	if(l==r){
		t[p]=a[l];
		return;
	}
	build(l,mid,lp);
	build(mid+1,r,rp);
	t[p]=t[lp]+t[rp];
}


void update_1(int l,int r,int k,int p){
	t[p]*=k;
	add_2[p]*=k;
	add_1[p]*=k;
}
void down_1(int l,int r,int p){
	if(add_1[p]==1)
		return;
	update_1(l,mid,add_1[p],lp);
	update_1(mid+1,r,add_1[p],rp);
	add_1[p]=1;
}
void change_1(int l,int r,int x,int y,int k,int p){
	if(r<x||l>y)
		return;
	if(x<=l&&r<=y){
		update_1(l,r,k,p);
		return;
	}
	down_1(l,r,p);
	change_1(l,mid,x,y,k,lp);
	change_1(mid+1,r,x,y,k,rp);
	t[p]=t[lp]+t[rp];
}


void update_2(int l,int r,int k,int p){
	t[p]+=(l-r+1)*k;
	add_2[p]+=k;
}
void down_2(int l,int r,int p){
	if(!add_2)
		return;
	update_2(l,mid,add_2[p],lp);
	update_2(mid+1,r,add_2[p],rp);
	add_2[p]=0;
}
void change_2(int l,int r,int x,int y,int k,int p){
	if(r<x||l>y){
		return;
	}
	if(x<=l&&r<=y){
		update_2(l,r,k,p);
		return;
	}
	down_2(l,r,p);
	change_2(l,mid,x,y,k,lp);
	change_2(mid+1,r,x,y,k,rp);
	t[p]=t[lp]+t[rp];
}


int query(int l,int r,int x,int y,int p){
	if(r<x||l>y)
		return 0;
	if(x<=l&&r<=y){
		return t[p];
	}
	down_1(l,r,p);
	down_2(l,r,p);
	return query(l,mid,x,y,lp)+query(mid+1,r,x,y,rp);
}


int main(){
	
	int n,q,m;
	scanf("%d%d%d",&n,&q,&m);
	
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	
	for(int i=0;i<(M<<2);i++){
		add_1[i]=1;
	}
	
	build(1,n,1);
	
	int op,l,r,k;
	
	while(q--){
		scanf("%d%d%d",&op,&l,&r);
		if(op==1){
			scanf("%d",&k);
			change_1(1,n,l,r,k,1);
		}else if(op==2){
			scanf("%d",&k);
			change_2(1,n,l,r,k,1);
		}else{
			printf("%d\n",query(1,n,l,r,1)%m);
		}
	} 
	
	
	return 0;
}
2025/1/31 10:15
加载中...