初学线段树求助
查看原帖
初学线段树求助
572482
Dream_weavers楼主2022/3/23 11:51

全WA

我要吐了,调了两个小时和题解对比一直没发现错

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e5+5;
int n,m,mod;
int a[N];
struct tree{
	int sum,mul,add;
	int l,r;
}s[N*4];
inline int lc(int x){
	return x<<1;
}
inline int rc(int x){
	return x<<1|1;
}

void pushup(int x){
	s[x].sum=(s[lc(x)].sum+s[rc(x)].sum)%mod;
}

void buildtree(int x,int l,int r){
	s[x].l=l;
	s[x].r=r;
	s[x].mul=1;
	if(l==r){
		s[x].sum=a[l]%mod;
		return ;
	}
	int mid=(l+r)/2;
	buildtree(lc(x),l,mid);
	buildtree(rc(x),mid+1,r);
	pushup(x);
}

void pushdown(int x){
	s[lc(x)].sum=(s[lc(x)].sum*s[x].mul+s[x].add*(s[lc(x)].r-s[lc(x)].l+1))%mod;
	s[rc(x)].sum=(s[rc(x)].sum*s[x].mul+s[x].add*(s[rc(x)].r-s[rc(x)].l+1))%mod;
	
	s[lc(x)].mul=(s[lc(x)].mul*s[x].mul)%mod;
	s[rc(x)].mul=(s[rc(x)].mul*s[x].mul)%mod;
	
	s[lc(x)].add=(s[lc(x)].add*s[x].mul+s[x].add)%mod;
	s[rc(x)].add=(s[rc(x)].add*s[x].mul+s[x].add)%mod;
	
	s[x].add=0;
	s[x].mul=1;
}

void cadd(int x,int l1,int r1,int d){
	if(l1<=s[x].l&&s[x].r<=r1){
		s[x].add=(s[x].add+d)%mod;
		s[x].mul=(s[x].sum+d*(s[x].r-s[x].l+1))%mod;
		return ;
	}
	pushdown(x);
	int mid=(s[x].l+s[x].r)/2;
	if(l1<=mid)cadd(lc(x),l1,r1,d);
	if(mid<r1)cadd(rc(x),l1,r1,d);
	pushup(x);
}

void cmul(int x,int l1,int r1,int d){
	if(l1<=s[x].l&&s[x].r<=r1){
		s[x].add=(s[x].add+d)%mod;
		s[x].mul=(s[x].mul+d)%mod;
		s[x].sum=(s[x].sum+d)%mod;
		return ;
	}
	pushdown(x);	
	int mid=(s[x].l+s[x].r)/2;
	if(l1<=mid)cmul(lc(x),l1,r1,d);
	if(mid<r1)cmul(rc(x),l1,r1,d);
	pushup(x);
}

int query(int x,int l1,int r1){
	if(l1<=s[x].l&&s[x].r<=r1) return s[x].sum;
	pushdown(x);
	int mid=(s[x].l+s[x].r)/2;
	int res=0;
	if(l1<=mid)res=(res+query(lc(x),l1,r1))%mod;
	if(mid<r1)res=(res+query(rc(x),l1,r1))%mod;
	return res;
}

signed main(){
	int op,x,y,k;
	scanf("%lld%lld%lld",&n,&m,&mod);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]); 
	buildtree(1,1,n);
	while(m--){
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			cadd(1,x,y,k);
		}else if(op==2){
			scanf("%lld%lld%lld",&x,&y,&k);
			cmul(1,x,y,k);
		}else{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",query(1,x,y));
		}
	} 
    return 0;
}

2022/3/23 11:51
加载中...