30分,求条
查看原帖
30分,求条
1034698
jzy_CSPJ_AK楼主2025/1/24 19:46

只过了#1 #3 #4

#include<bits/stdc++.h>
#define int long long
using namespace std;
#define lid (id << 1)
#define rid (id << 1 | 1)
using ll = long long;

constexpr int MAXN = 1e6 + 55;
constexpr int root = 1;
int mod;

struct Node{
    int add, sum, mul;
}t[MAXN];

int a[MAXN];

namespace sgt{
    void merge(int id){
        t[id].sum = (t[lid].sum + t[rid].sum) % mod;
        t[id].mul = 1, t[id].add = 0;
    }

    void build(int id, int l , int r){
        if(l == r){
            t[id].sum = a[l];
            t[id].add = 0;
            t[id].mul = 1;
            return ;
        }
        int mid = l + r >> 1;
        build(lid, l, mid);
        build(rid, mid + 1, r);
        merge(id);
    }

    void push_down(int id, int cl, int cr){
        int mid = cl + cr >> 1;
        t[lid].sum = (t[lid].sum * t[id].mul + (mid - cl + 1) * t[id].add) % mod;
        t[rid].sum = (t[rid].sum * t[id].mul + (cr - mid) * t[id].add) % mod;
        t[lid].mul *= t[id].mul;t[lid].mul %= mod;
        t[rid].mul *= t[id].mul;t[rid].mul %= mod;
        t[lid].add += t[id].add;t[lid].add %= mod;
        t[rid].add += t[id].add;t[rid].add %= mod;
        t[id].add = 0, t[id].mul = 1;
    }

    ll qry(int l, int r, int id, int cl, int cr){
        if(r < cl || l > cr)return 0;
        if(cl >= l && cr <= r){
            return t[id].sum;
        }
        push_down(id, cl, cr);
        int mid = cl + cr >> 1;
        return (qry(l, r, lid, cl, mid) + qry(l, r, rid, mid + 1, cr)) % mod;
    }

    void modify_add(int l, int r, ll x, int id, int cl , int cr){
        if(r < cl || l > cr)return ;
        if(cl >= l && cr <= r){
            t[id].add += x;t[id].add %= mod;
            t[id].sum += (cr - cl + 1) * x;t[id].sum %= mod;
            return ;
        }
        int mid = cl + cr >> 1;
        push_down(id, cl, cr);
        modify_add(l, r, x, lid, cl, mid);
        modify_add(l, r, x, rid, mid + 1, cr);
        merge(id);
    }

    void modify_mul(int l, int r, ll x, int id, int cl , int cr){
        if(r < cl || l > cr)return ;
        if(cl >= l && cr <= r){
            t[id].mul *= x;t[id].mul %= mod;
            t[id].sum *= x;t[id].sum %= mod;
            t[id].add *= x;t[id].add %= mod;
            return ;
        }
        int mid = cl + cr >> 1;
        push_down(id, cl, cr);
        modify_mul(l, r, x, lid, cl, mid);
        modify_mul(l, r, x, rid, mid + 1, cr);
        merge(id);
    }
}

signed main(){
    int n, y;
    cin >> n >> y >> mod;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
    }
    sgt::build(1, 1, n);
    while(y --){
        int flag, a, b, c;
        cin >> flag;
        if(flag == 1){
            cin >> a >> b >> c;
            sgt::modify_mul(a, b, c % mod, root, 1, n);
        } else if(flag == 2){
            cin >> a >> b >> c;
            sgt::modify_add(a, b, c % mod, root, 1, n);    
        } else {
            cin >> a >> b;
            cout << sgt::qry(a, b, root, 1, n) % mod << endl;
        }
    }
}
2025/1/24 19:46
加载中...