抽风代码在线求调
查看原帖
抽风代码在线求调
641839
Fracture_Hikari楼主2023/1/14 18:57
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Tree{
	const int maxn=100005;
	int val[maxn];
	int n,m;
	int p;
	struct tree{
		int l,r;
		int lson,rson;
		int sum;
		int tag;
		int mul;
	}a[maxn*2];
	void pushup(int x){
		a[x].sum=(a[a[x].lson].sum+a[a[x].rson].sum)%p;
	}
	int cnt=0;
	int Root;
	void Build(int &x,int l,int r){
		if(x==0){ 
			x=++cnt;
			a[x].l=l;
			a[x].r=r;
			a[x].tag=0;
			a[x].mul=1;
		}
		if(l==r){ 
			a[x].sum=val[l]; 
			return ;
		}
		int mid=(l+r)/2; 
		Build(a[x].lson,l,mid);
		Build(a[x].rson,mid+1,r);
		pushup(x); 
	}
	void pushdown(int x){
		if(a[x].mul!=1){
			a[a[x].lson].sum=(a[a[x].lson].sum*a[x].mul)%p;
			a[a[x].rson].sum=(a[a[x].rson].sum*a[x].mul)%p;
			a[a[x].lson].mul=(a[a[x].lson].mul*a[x].mul)%p;
			a[a[x].rson].mul=(a[a[x].rson].mul*a[x].mul)%p;
			a[a[x].lson].tag=(a[a[x].lson].tag*a[x].mul)%p;
			a[a[x].rson].tag=(a[a[x].rson].tag*a[x].mul)%p;
		}
		if(a[x].tag!=0){
			a[a[x].lson].sum=(a[a[x].lson].sum+a[x].tag)%p;
			a[a[x].rson].sum=(a[a[x].rson].sum+a[x].tag)%p;
			a[a[x].lson].tag=(a[a[x].lson].tag+a[x].tag)%p;
			a[a[x].rson].tag=(a[a[x].rson].tag+a[x].tag)%p;
		}
		a[x].tag=0;
		a[x].mul=1;
	}
	void change(int x,int l,int r,int y){
		if(l>a[x].r||r<a[x].l)
			return ;
		if(l<=a[x].l&&a[x].r<=r){
			a[x].sum=(a[x].sum+y*(a[x].r-a[x].l+1))%p; 
			a[x].tag=(a[x].tag+y)%p;
			return ;
		}
		pushdown(x);
		change(a[x].lson,l,r,y);
		change(a[x].rson,l,r,y);
		pushup(x);
	}
	void mul(int x,int l,int r,int y){
		if(l>a[x].r||r<a[x].l)
			return ;
		if(l<=a[x].l&&a[x].r<=r){
			a[x].sum=(a[x].sum*y)%p;
			a[x].mul=(a[x].mul*y)%p;
			a[x].tag=(a[x].tag*y)%p;
			return ;
		}
		pushdown(x);
		change(a[x].lson,l,r,y);
		change(a[x].rson,l,r,y);
		pushup(x);
	}
	long long ask(int x,int l,int r){
		if(a[x].l>r||a[x].r<l)
			return 0;
		//cout<<l<<" "<<r<<" "<<a[x].l<<" "<<a[x].r<<" "<<a[x].sum<<endl;
		if(l<=a[x].l&&a[x].r<=r)
			return a[x].sum;
		pushdown(x);
		return (ask(a[x].lson,l,r)+ask(a[x].rson,l,r))%p;
		pushup(x);
	}
	int main(){
		cin>>n>>m>>p;
		for(int i=1;i<=n;i++)
			cin>>val[i];
		Build(Root,1,n);
		for(int i=1;i<=m;i++){
			int op;
			int x,y;
			cin>>op>>x>>y;
			if(op==1){
				int k;
				cin>>k;
				change(Root,x,y,k); 
			}
			else if(op==2){
				int k;
				cin>>k;
				mul(Root,x,y,k); 
			} 
			else
				printf("%lld\n",ask(Root,x,y)%p);
		}
		return 0;
	}
}
signed main(){return (int)Tree::main();}
2023/1/14 18:57
加载中...