线段树2求调
  • 板块题目总版
  • 楼主zhuoheng
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/2/24 12:15
  • 上次更新2024/2/24 15:18:27
查看原帖
线段树2求调
1023698
zhuoheng楼主2024/2/24 12:15
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct node{
	int add,mul,sum;
}Tree[4*N];
int n,m,p,a[N];
void push_up(int id){
	Tree[id].sum=(Tree[id*2].sum+Tree[id*2+1].sum)%p;
}
void push_down(int id,int l,int r){
	int mid=(l+r)/2;
	Tree[id].sum*=Tree[id].mul,Tree[id].sum%=p;
	Tree[id].sum+=Tree[id].add,Tree[id].sum%=p;
	Tree[id*2].mul*=Tree[id].mul,Tree[id*2].mul%=p;
	Tree[id*2].add+=Tree[id].add,Tree[id*2].add%=p;
	Tree[id*2+1].mul*=Tree[id].mul,Tree[id*2+1].mul%=p;
	Tree[id*2+1].add+=Tree[id].add,Tree[id*2+1].add%=p;
	Tree[id].mul=1,Tree[id].add=0;
}
void build(int id,int l,int r){
	Tree[id].mul=1,Tree[id].add=0;
	if(l==r){
		Tree[id].sum=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	push_up(id);
}
void update(int id,int l,int r,int x,int y,int v,int op){
	if(x>=l&&r<=y){
		if(op==2){
			Tree[id].sum*=v,Tree[id].sum%=p;
			Tree[id].mul*=v,Tree[id].mul%=p;
			Tree[id].add*=v,Tree[id].add%=p;
		}
		else{
			Tree[id].sum+=v,Tree[id].sum%=p;
			Tree[id].add+=v,Tree[id].add%=p;
		}
		return ;
	}
	push_down(id,l,r);
	int mid=(l+r)>>1;
	if(x<=mid)update(id*2,l,mid,x,y,v,op);
	if(y>mid)update(id*2+1,mid+1,r,x,y,v,op);
	push_up(id);
}
int query(int id,int l,int r,int x,int y){
	if(x>=l&&r<=y)return Tree[id].sum;
	push_down(id,l,r);
	int mid=(l+r)>>1,ans=0;
	if(x<=mid)ans=(ans+query(id,l,mid,x,y))%p;
	if(y>mid)ans=(ans+query(id,mid+1,r,x,y))%p;
	return ans;
}
int main(){
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    build(1,1,n);
    while(m--){
    	int op,x,y,k;
    	scanf("%d%d%d",&op,&x,&y);
    	if(op==1||op==2){
    		scanf("%d",&k);
    		update(1,1,n,x,y,k,op);
		}
		else printf("%d",query(1,1,n,x,y));
	}
    return 0;
}

程序卡住了

2024/2/24 12:15
加载中...