玄关,WA+RE30prs求调
查看原帖
玄关,WA+RE30prs求调
1128559
guoguo160楼主2025/1/24 22:09

玄关,WA+RE30prs求调

提交记录

#include <bits/stdc++.h>

#define tag_mul mul_tag

#define int long long 

#define root 1,n,1

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

using namespace std;

const int N=1e5+10;

int n,q,m,a[N];

struct Node{
	int l,r;
	int add_tag;
    int mul_tag;
	int sum;
	Node() {
		l=r=add_tag=sum=0;
        mul_tag=1;
	}
}z[N<<3];

void color_add(int rt,int v) {
	(z[rt].sum+=v*(z[rt].r-z[rt].l+1))%=m;
	(z[rt].add_tag+=v)%=m;
}

Node operator +(Node a,Node b){
	Node c;
	c.l=a.l;
	c.r=b.r;
	c.sum=(a.sum+b.sum)%m;
	return c;
}

void push_add(int rt) {
	if(z[rt].add_tag!=0) {
		color_add(rt<<1,z[rt].add_tag);
		color_add(rt<<1|1,z[rt].add_tag);
		z[rt].add_tag=0;
	}
}

void color_mul(int rt, int v) {
    push_add(rt);
    z[rt].sum = z[rt].sum * v % m;
    z[rt].mul_tag*=v;
    z[rt].mul_tag%=m;
}

void push_mul(int rt) {
    if(z[rt].tag_mul!=1) {
        color_mul(rt<<1,z[rt].tag_mul);
        color_mul(rt<<1|1,z[rt].tag_mul);
        z[rt].tag_mul=1;
    }
}

void build(int l,int r,int rt){
	if(l==r){
		z[rt].l=z[rt].r=l;
		z[rt].sum=a[l];
		return;
	}
	int m=(l+r)>>1;
	build(lson);
	build(rson);
	z[rt]=z[rt<<1]+z[rt<<1|1];
}

void modify_add(int l,int r,int rt,int nowl,int nowr,int val){
	if(l>=nowl&&r<=nowr) {
        push_add(rt);push_mul(rt);
		color_add(rt,val);
		return;
	}
	push_add(rt);push_mul(rt);
    push_mul(rt);
	int m=(l+r)>>1;
	if(nowl<=m){
		modify_add(lson,nowl,nowr,val);
	}
	if(nowr>m) {
		modify_add(rson,nowl,nowr,val);
	}
	z[rt]=z[rt<<1]+z[rt<<1|1];
}

void modify_mul(int l,int r,int rt,int nowl,int nowr,int val){
	if(l>=nowl&&r<=nowr) {
		push_add(rt);push_mul(rt);
		color_mul(rt,val);
		return;
	}
	push_add(rt);push_mul(rt);
    push_mul(rt);
	int m=(l+r)>>1;
	if(nowl<=m){
		modify_mul(lson,nowl,nowr,val);
	}
	if(nowr>m) {
		modify_mul(rson,nowl,nowr,val);
	}
	z[rt]=z[rt<<1]+z[rt<<1|1];
}

Node query(int l,int r,int rt,int nowl,int nowr) {
	if(l>=nowl&&r<=nowr){
		push_add(rt);push_mul(rt);
		return z[rt];
	}
	push_add(rt);push_mul(rt);
	Node res;
	int m=(l+r)>>1;
	if(nowl<=m){
		res=res+query(lson,nowl,nowr);
	}
	if(nowr>m){
		res=res+query(rson,nowl,nowr);
	}
	return res;
}

signed main() {
	cin>>n>>q>>m;
	for(int i=1;i<=n;++i){
		cin>>a[i];
	}
	build(root);
	while(q--) {
		int opt;
		cin>>opt;
		if(opt==1){
//            cout<<"#guoguo160"<<"\n";
			int x,y,k;
			cin>>x>>y>>k;
			modify_mul(root,x,y,k);
        }
		else if(opt==2) {
			int x,y,k;
			cin>>x>>y>>k;
			modify_add(root,x,y,k); 
		}
		else{
			int x,y;
			cin>>x>>y;
			cout<<query(root,x,y).sum%m<<"\n";
		}
	}
	return 0;
}
2025/1/24 22:09
加载中...