萌新妹子,线段树2停止运行,求助!!!
查看原帖
萌新妹子,线段树2停止运行,求助!!!
538821
m1kusama楼主2023/8/3 14:47
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
		x=x*10+ch-'0',ch=getchar();
	return x*f;
}

void write(int x)
{
	if(x<0)
		putchar('-'),x=-x;
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
	return;
}
const int N=100005;
int n,q,m;
int a[N],opt,x,y,k;
struct tree{
	int l,r,adt,plt,v;
}t[N<<2];
void build(int now,int l,int r){
	t[now].l=l;
	t[now].r=r;
	t[now].plt=1;
	if(l==r){ t[now].v=a[l];return;}
	int mid=(l+r)>>1;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	t[now].v=t[now*2].v+t[now*2+1].v;
	return;
}
void down(int now){
	t[now*2].v=(t[now].plt*t[now*2].v+
	((t[now*2].r-t[now*2].l+1)*t[now].adt)%k)%k;
	t[now*2+1].v=(t[now].plt*t[now*2+1].v+
	((t[now*2+1].r-t[now*2+1].l+1)*t[now].adt)%k)%k;
	t[now*2].plt=t[now*2].plt*t[now].plt%k;
	t[now*2+1].plt=t[now*2+1].plt*t[now].plt%k;
	t[now*2].adt+=t[now].adt;
	t[now*2].adt%=k;
	t[now*2+1].adt+=t[now].adt;
	t[now*2+1].adt%=k;
	t[now].adt=0;
	t[now].plt=1;
}

void pl(int l,int r,int k1,int now){
	if(t[now].l>=l and t[now].r<=r){
		t[now].adt=(t[now].adt*k1)%k;
		t[now].plt=(t[now].plt*k1)%k;
		t[now].v=t[now].v*k1%k;
		return;
	}
	down(now);
//	t[now].v=t[now*2].v+t[now*2+1].v;
	int mid=(t[now].l+t[now].r)>>1;
	if(l<=mid) pl(l,r,k1,now*2);
	if(r>mid) pl(l,r,k1,now*2+1);
	t[now].v=(t[now*2].v+t[now*2+1].v)%k;
	return;
}

void ad(int l,int r,int k1,int now){
	if(t[now].l>=l and t[now].r<=r){
		t[now].adt=(t[now].adt+k1)%k;
		t[now].v=
		t[now].v+k1*(t[now].r-t[now].l+1)%k;
		return;
	}
	down(now);
//	t[now].v=t[now*2].v+t[now*2+1].v;
	int mid=(t[now].l+t[now].r)>>1;
	if(l<=mid) ad(l,r,k1,now*2);
	if(r>mid) ad(l,r,k1,now*2+1);
	t[now].v=(t[now*2].v+t[now*2+1].v)%k;
	return;
}
int ask(int l,int r,int now){
	if(t[now].l>=l and t[now].r<=r){
		return t[now].v;
	}
	down(now);
	int ans=0;
	int mid=(t[now].l+t[now].r)>>1;
	if(l<=mid) ans+=ask(l,r,now*2);
	if(r>mid) ans+=ask(l,r,now*2+1);
	return ans;
}
signed main(){
	n=read();
	m=read();
	k=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,n,1);
	for(int i=1;i<=m;i++){
		opt=read(),x=read(),y=read();
		if(opt==1){
			k=read();
			pl(x,y,k,1);
		}else if(opt==2){
			k=read();
			ad(x,y,k,1);
		}else{
			ask(x,y,1);
		}
	}
	return 0;
}
2023/8/3 14:47
加载中...