全RE求救
查看原帖
全RE求救
466312
无奈之白楼主2022/6/18 22:24
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <vector>
#define N 30000
#define ll long long
#define mid (tree[i].r+tree[i].l)/2
#define MAXN 100010
#define INF 10000009
#define MOD 10000007
using namespace std;
int n,m,p,in_put[N];
struct T{
	ll sum,add,l,r;
	ll mul=1;
}tree[N];
void build(ll i,ll l,ll r){
	tree[i].l=l,tree[i].r=r;
	if(tree[i].l==tree[i].r){
		tree[i].sum=in_put[l]%p;
		return ;
	}
	build(i*2,1,mid);
	build(i*2+1,mid+1,r);
	tree[i].sum=(tree[i*2].sum+tree[i*2+1].sum)%p;
	return ;
}
void up_date(ll i){
	ll v=tree[i].mul;
	tree[i].mul=1;
	tree[i*2].sum=tree[i*2].sum*v%p;
	tree[i*2+1].sum=tree[i*2+1].sum*v%p;
	tree[i*2].add=tree[i*2].add*v%p;
	tree[i*2+1].add=tree[i*2+1].add*v%p;
	v=tree[i].add;
	tree[i].add=0;
	tree[i*2].sum+=(tree[i*2].r-tree[i*2].l+1)*v;
	tree[i*2+1].sum+=(tree[i*2+1].r-tree[i*2+1].l+1)*v;
	tree[i*2].add+=v,tree[i*2+1].add+=v;
}
void add(ll i,ll l,ll r,ll k){
	if(tree[i].l>=l&&tree[i].r<=r){
		tree[i].sum+=(tree[i].r-tree[i].l+1)*k%p;
		tree[i].add=(tree[i].add+k)%p;
		return ;
	}
	up_date(i); 
	if(mid>=l)add(i*2,l,r,k);
	if(mid<=r)add(i*2+1,l,r,k);
	tree[i].sum=(tree[i*2].sum+tree[i*2+1].sum)%p;
}
void mul(int i,int l,int r,int j){
	if(tree[i].l>=l&&tree[i].r<=r){
		tree[i].sum=tree[i].sum*j%p;
		tree[i].mul=tree[i].mul*j%p;
		tree[i].add=tree[i].add*j%p;
		return ;
	}
	up_date(i);
	if(mid>=l)mul(i*2,l,r,j);
	if(mid<=r)mul(i*2+1,l,r,j);
	tree[i].sum=(tree[i*2].sum+tree[i*2+1].sum)%p;
}
ll search(ll i,ll l,ll r){
	if(tree[i].l>=l&&tree[i].r<=r){
	    return tree[i].sum;
	}
	ll ans=0;
	up_date(i);
	if(mid>=l)ans+=search(i*2,l,r)%p;
	if(mid<=r)ans+=search(i*2+1,l,r)%p;
}
int main(){
	ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)cin>>in_put[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
	long long fl,a,b,c;
        cin>>fl;
        if(fl==1){
           	cin>>a>>b>>c;
            c%=p;
            mul(1,a,b,c);
        }
        if(fl==2){
            cin>>a>>b>>c;
            c%=p;
            add(1,a,b,c);
        }
        if(fl==3){
            cin>>a>>b;
            cout<<search(1,a,b)<<endl;
        }
	}
	return 0;
} 

2022/6/18 22:24
加载中...