0 pts 求调
查看原帖
0 pts 求调
961351
nightwatch.ryan楼主2024/10/4 22:33

rt,实在不知道到底哪里错了,求条

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 100005;

int a[maxn], p;

struct SegmentTree{
    int l, r, add_val;
    int tag, tag2; // tag 是加法的, tag2 是乘法的
}tr[maxn * 4];

void build(int p, int l, int r){
    tr[p].l = l, tr[p].r = r, tr[p].tag2 = 1;
    if(l == r){
        tr[p].add_val = a[l] % p;
        return;
    }
    int mid = (l + r) >> 1;
    build(p * 2, l, mid);
    build(p * 2 + 1, mid + 1, r);
    tr[p].add_val = (tr[p * 2].add_val + 
                     tr[p * 2 + 1].add_val) % p;
}
void pushdown(int p){
    int mid = (tr[p].l + tr[p].r) >> 1;
    tr[p * 2].add_val = (tr[p * 2].add_val * tr[p].tag2 % p+ 
                         tr[p].tag * (tr[p * 2].r - tr[p * 2].l + 1) % p) % p;
    tr[p * 2 + 1].add_val = (tr[p * 2 + 1].add_val * tr[p].tag2 % p + 
                             tr[p].tag * (tr[p * 2 + 1].r - tr[p * 2 + 1].l + 1) % p) % p;

    tr[p * 2].tag2 = (tr[p * 2].tag2 * tr[p].tag2) % p;
    tr[p * 2 + 1].tag2 = (tr[p * 2 + 1].tag2 * tr[p].tag2) % p;
    
    tr[p * 2].tag = (tr[p * 2].tag * tr[p].tag2 + tr[p].tag) % p;
    tr[p * 2 + 1].tag = (tr[p * 2 + 1].tag * tr[p].tag2 + tr[p].tag) % p;

    tr[p].tag = 0, tr[p].tag2 = 1;
}

void update(int p, int l, int r, int val){
    if(l <= tr[p].l && r >= tr[p].r){
        tr[p].add_val = (tr[p].add_val + val * (tr[p].r - tr[p].l + 1) % p) % p;
        tr[p].tag = (tr[p].tag + val) % p;
        return;
    }
    pushdown(p);
    //toto
    int mid = (tr[p].l + tr[p].r) >> 1;
    if(l <= mid) update(p * 2, l, r, val); 
    if(r > mid) update(p * 2 + 1, l, r, val); 
    tr[p].add_val = tr[p * 2].add_val + tr[p * 2 + 1].add_val; 
}

void update2(int p, int l, int r, int val){
    if(l <= tr[p].l && r >= tr[p].r){ 
        tr[p].tag2 = tr[p].tag2 * val % p;
        tr[p].tag = tr[p].tag * val % p;
        tr[p].add_val = tr[p].add_val * val % p;
        return;
    }
    pushdown(p);
    int mid = (tr[p].l + tr[p].r) >> 1;
    if(l <= mid) update2(p * 2, l, r, val); 
    if(r > mid) update2(p * 2 + 1, l, r, val); 
    tr[p].add_val = tr[p * 2].add_val * tr[p * 2 + 1].add_val;
}


int query(int p, int l, int r){ 
    if(l <= tr[p].l && r >= tr[p].r){ 
        return tr[p].add_val;
    }
    pushdown(p);
    int mid = (tr[p].l + tr[p].r) >> 1, ans = 0;
    if(l <= mid) ans += query(p * 2, l, r), ans %= p;
    if(r > mid) ans += query(p * 2 + 1, l, r), ans %= p;
    return ans;
}

int32_t main(){
    int n, m; cin >> n >> m >> p;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    build(1, 1, n);
    for(int i = 1; i <= m; i ++){
        int op, l, r, val;
        cin >> op >> l >> r;
        if(op == 1) cin >> val, update2(1, l, r, val);
        else if(op == 2) cin >> val, update(1, l, r, val);
        else cout << query(1, l, r) << endl;
    }
}


2024/10/4 22:33
加载中...