社区讨论

听灌佬多 玄关orzQAQ

灌水区参与者 108已保存回复 698

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
686 条
当前快照
1 份
快照标识符
@lygy14y4
此快照首次捕获于
2024/07/11 15:24
2 年前
此快照最后确认于
2024/07/11 16:30
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct Node{
	int l,r,w,bj1,bj2;
}a[800001];
int b[100001],md;
int push_up(int p){
	return a[p*2].w+a[p*2+1].w;
}
void build(int p,int l,int r){
	a[p].l=l;
	a[p].r=r;
	if(l==r){
		a[p].bj1=1;
		a[p].w=b[l]%md;
		return;
	}
	int mid=l+r>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	a[p].w=push_up(p);
	a[p].bj1=1;
}
void work(int p,int l,int r,int c){
	if(a[p].l==l&&a[p].r==r){
		if(l!=r){
			a[p].w+=(r-l+1)*a[p].bj2;
			a[p].w%=md;
			a[p*2].bj2=a[p].bj2;
			a[p*2+1].bj2=a[p].bj2;
			a[p].bj2=0;
			a[p].bj1+=c;
		}
		else{
			a[p].w+=a[p].bj2;
			a[p].bj2=0;
			a[p].bj1+=c;
		}
		return;
	}
	int mid=a[p].l+a[p].r>>1; 
	if(l>mid){
		work(p*2+1,l,r,c);
	}
	else if(r<=mid){
		work(p*2,l,r,c);
	}
	else{
		work(p*2+1,mid+1,r,c);
		work(p*2,l,mid,c);
	}
}
void work1(int p,int l,int r,int c){
	if(a[p].l==l&&a[p].r==r){
		if(a[p].bj1!=1&&l!=r){
			a[p].w*=a[p].bj1;
			a[p].w%=md;
			a[p*2].bj1=a[p].bj1;
			a[p*2+1].bj1=a[p].bj1;
			a[p].bj1=1;
			a[p].bj2+=c;
		}
		else{
			a[p].w*=a[p].bj1;
			a[p].bj1=1;
			a[p].bj2=c;
		}
		return;
	}
	int mid=a[p].l+a[p].r>>1; 
	if(l>mid){
		work1(p*2+1,l,r,c);
	}
	else if(r<=mid){
		work1(p*2,l,r,c);
	}
	else{
		work1(p*2+1,mid+1,r,c);
		work1(p*2,l,mid,c);
	}
}
int work3(int p,int l,int r){
	a[p].w+=(r-l+1)*a[p].bj2;
	a[p].w*=a[p].bj1;
	a[2*p].bj2=a[p].bj2;
	a[2*p+1].bj2=a[p].bj2;
	a[p].bj2=0;
	a[2*p].bj1=a[p].bj1;
	a[2*p+1].bj1=a[p].bj1;
	a[p].bj1=1;
	if(l==a[p].l&&r==a[p].r){
		a[p].w%=md;
		return a[p].w;
	}
	int mid=a[p].l+a[p].r>>1;
	if(l>mid){
		return work3(p*2+1,l,r);
	}
	else if(r<=mid){
		return work3(p*2,l,r);
	}
	else{
		return (work3(p*2,l,mid)+work3(p*2+1,mid+1,r))%md;
	}
}
int main(){
	int n;
	scanf("%d%d",&n,&md);
	for(int i=1;i<=n;i++){
		scanf("%d",&b[i]);
	}
	build(1,1,n);
	int m;
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		int op;
		scanf("%d",&op);
		if(op==1){
			int t,g,c;
			scanf("%d%d%d",&t,&g,&c);
			c%=md;
			work(1,t,g,c);
		}
		else if(op==2){
			int t,g,c;
			scanf("%d%d%d",&t,&g,&c);
			work1(1,t,g,c);
		}
		else{
			int t,g;
			scanf("%d%d",&t,&g);
			printf("%d\n",work3(1,t,g)%md);
		}
	}
	return 0;
}

回复

698 条回复,欢迎继续交流。

正在加载回复...