线段树求教,样例都没过。
查看原帖
线段树求教,样例都没过。
289275
Terraria楼主2021/1/25 09:50

看了好久还是没找到自己的问题出在哪。。

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
	int num;
	int add=0;
	int mul=1;
}t[2000009];
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<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0) x=~x+1,putchar('-');if(x>9) write(x/10);putchar(x%10+'0');}
int n,m,P,a[100009],op,x,y,k;
void push_up(int p){
	t[p].num=t[p*2].num+t[p*2+1].num;
	t[p].num%=P;
}
void push_down(int p, int l, int r){
    int m=(l+r)/2;
    
    t[p*2].num=(t[p*2].num*t[p].mul+t[p].add*(m-l+1))%P;
    t[p*2+1].num=(t[p*2+1].num*t[p].mul+t[p].add*(r-m))%P;
    
    t[p*2].mul=(t[p*2].mul*t[p].mul)%P;
    t[p*2+1].mul=(t[p*2+1].mul*t[p].mul)%P;
    
    t[p*2].add=(t[p*2].add*t[p].mul+t[p].add)%P;
    t[p*2+1].add=(t[p*2+1].add*t[p].mul+t[p].add)%P;
    
    t[p].mul=1;
    t[p].add=0;
    
    return;
}
void build(int l,int r,int p){
	if(l==r){
		t[p].num=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	push_up(p);
}
void update_add(int l,int r,int nowl,int nowr,int k,int p){
	if(l<=nowl&&nowr<=r){
		t[p].add=(t[p].add*k)%P;
		t[p].num=(t[p].num+(nowr-nowl+1)*k)%P;
		return;
	}
	push_down(p,nowl,nowr);
	int mid=(nowl+nowr)/2;
	if(mid>=l) update_add(l,r,nowl,mid,k,p*2);
	if(mid<r)  update_add(l,r,mid+1,nowr,k,p*2+1);
	push_up(p);
}
void update_mul(int l,int r,int nowl,int nowr,int k,int p){
	if(l<=nowl&&nowr<=r){
		t[p].num=(t[p].num*k)%P;
		t[p].mul=(t[p].mul*k)%P;
		t[p].add=(t[p].add*k)%P;
		return;
	}
	push_down(p,nowl,nowr);
	int mid=(nowl+nowr)/2;
	if(mid>=l) update_mul(l,r,nowl,mid,k,p*2);
	if(mid<r)  update_mul(l,r,mid+1,nowr,k,p*2+1);
	push_up(p);
}
int query(int l,int r,int nowl,int nowr,int p){
	if(l<=nowl&&nowr<=r) return t[p].num;
	push_down(p,nowl,nowr);
	int mid=(nowl+nowr)/2;
	int sum=0;
	if(mid>=l) sum+=query(l,r,nowl,mid,p*2);
	if(mid<r)  sum+=query(l,r,mid+1,nowr,p*2+1);
	return sum;
}
void solve(){
	n=read(),m=read(),P=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,n,1);
	while(m--){
		cin>>op;
		if(op==1){
			x=read(),y=read(),k=read();
			update_mul(x,y,1,n,k,1);
		}
		if(op==2){
			x=read(),y=read(),k=read();
			update_add(x,y,1,n,k,1);
		}
		if(op==3){
			x=read(),y=read();
			cout<<query(x,y,1,n,1)%P<<endl;
		}
	}
}
signed main(){
	solve();
}
2021/1/25 09:50
加载中...