线段树 WA求调
查看原帖
线段树 WA求调
631896
Wangtsjo楼主2022/11/23 15:06

线段树又调不出来了(哭)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
struct node{
	int l,r;ll sum;
	int add,mul;
}t[N<<4];
ll a[N];
int n,m,p;
inline void pd(int q){
	t[q<<1].sum=(t[q<<1].sum*t[q].mul+t[q].add*(t[q<<1].r-t[q<<1].l+1))%p;
	t[q<<1|1].sum=(t[q<<1|1].sum*t[q].mul+t[q].add*(t[q<<1|1].r-t[q<<1|1].l+1))%p;
	t[q<<1].mul=(t[q].mul*t[q<<1].mul)%p;
	t[q<<1|1].mul=(t[q].mul*t[q<<1|1].mul)%p;
	t[q<<1].add=(t[q].add+t[q<<1].add*t[q].mul)%p;
	t[q<<1|1].add=(t[q].add+t[q<<1|1].add*t[q].mul)%p;
	t[q].add=0;t[q].mul=1;
}
inline void build(int q,int l,int r){
	t[q].l=l;t[q].r=r;t[q].mul=1;t[q].add=0;t[q].sum=0;
	if(l==r){
		t[q].sum=a[l]%p;return ;
	}
	int mid=(l+r)>>1;
	build(q<<1,l,mid);build(q<<1|1,mid+1,r);
	t[q].sum=(t[q<<1].sum+t[q<<1|1].sum)%p;
}
inline void upadd(int q,int l,int r,int val){
	if(t[q].r<l||t[q].l>r) return ;
	if(t[q].r<=r&&t[q].l>=l){
		t[q].add=(t[q].add+val)%p;return ;
		t[q].sum+=((t[q].r-t[q].l+1))%p; 
	}
	pd(q);
	int mid=(t[q].l+t[q].r)>>1;
	if(l<=mid)upadd(q<<1,l,mid,val);
	if(r>mid)upadd(q<<1|1,mid+1,r,val);
	t[q].sum+=(t[q<<1].sum+t[q<<1|1].sum)%p;
}
inline void upmul(int q,int l,int r,int val){
	if(t[q].r<l||t[q].l>r) return ;
	if(t[q].r<=r&&t[q].l>=l){
		t[q].mul=(t[q].mul*val)%p;
		t[q].sum=(t[q].sum*val)%p;
		return ; 
	}
	pd(q);
	int mid=(l+r)>>1;
	if(l<=mid) upmul(q,l,mid,val);
	if(r>mid) upmul(q,mid+1,r,val);
	t[q].sum+=(t[q<<1].sum+t[q<<1|1].sum)%p;
}
inline ll query(int q,int l,int r){
	if(t[q].r<l||t[q].l>r) return 0;
	if(t[q].r<=r&&t[q].l>=l){
		return t[q].sum%p;
	}
	ll val=0;
	pd(q);
	int mid=(t[q].l+t[q].r)>>1;
	if(l<=mid) val=(val+query(q<<1,l,r));
	if(r>mid) val=(val+query(q<<1|1,l,r));
	return val;
}
int main(){
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--){
		int ch,x,y,k;
		scanf("%d%d%d",&ch);
		if(ch==1)scanf("%d",&k),upadd(1,x,y,k);
		if(ch==2)scanf("%d",&k),upmul(1,x,y,k);
		if(ch==3)printf("%lld",query(1,x,y)%p);	
	}
	return 0;
}
2022/11/23 15:06
加载中...