0分求助,能过样例
查看原帖
0分求助,能过样例
435689
sillage丶楼主2021/7/29 01:42
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX = 1e5 + 10;

long long t[MAX << 2];
long long la[MAX << 2];
long long lam[MAX << 2];
int n, m, mod;

inline int lson(int x){
    return x << 1;
}

inline int rson(int x){
    return lson(x) | 1;
}

void push_up(int p){
    t[p] = (t[lson(p)] + t[rson(p)]) % mod;
}

void build(int p, int s, int e){
    if(s == e){
        scanf("%lld", &t[p]);
        return;
    }
    int mid = s + ((e - s) >> 1);
    build(lson(p), s, mid);
    build(rson(p), mid + 1, e);
    push_up(p);
}

void push_down(int p, int s, int e){
    if(la[p] == 0 && lam[p] == 1){
        return;
    }
    long long& lazy = la[p];
    long long& lazym = lam[p];
    int mid = s + ((e - s) >> 1);
    int ls = lson(p);
    int rs = rson(p);
    t[ls] = (t[ls] * lazym + lazy * (mid - s + 1)) % mod;
    t[rs] = (t[rs] * lazym + lazy * (e - mid)) % mod;
    la[ls] = (la[ls] * lazym + lazy) % mod;
    la[rs] = (la[rs] * lazym + lazy) % mod;
    lam[ls] = (lam[ls] * lazy) % mod;
    lam[rs] = (lam[rs] * lazy) % mod;
    lazy = 0;
    lazym = 1;
}

long long query(int p, int s, int e, int l, int r){
    if(l <= s && e <= r){
        return t[p] % mod;
    }
    push_down(p, s, e);
    int mid = s + ((e - s) >> 1);
    long long ret = 0;
    if(l <= mid){
        ret = (ret + query(lson(p), s, mid, l, r)) % mod;
    }
    if(r > mid){
        ret = (ret + query(rson(p), mid + 1, e, l, r)) % mod;
    }
    return ret;
}


void modifya(int p, int s, int e, int l, int r, int d){
    if(l <= s && e <= r){
        t[p] = (t[p] + d * (e - s + 1)) % mod;
        la[p] = (la[p] + d) % mod;
        return;
    }
    push_down(p, s, e);
    int mid = s + ((e - s) >> 1);
    if(l <= mid){
        modifya(lson(p), s, mid, l, r, d);
    }
    if(r > mid){
        modifya(rson(p), mid + 1, e, l , r, d);
    }
    push_up(p);
}

void modifym(int p, int s, int e, int l, int r, int k){
    if(l <= s && e <= r){
        t[p] = (t[p] * k) % mod;
        la[p] = (la[p] * k) % mod;
        lam[p] = (lam[p] * k) % mod;
        return;
    }
    push_down(p, s, e);
    int mid = s + ((e - s) >> 1);
    if(l <= mid){
        modifym(lson(p), s, mid, l, r, k);
    }
    if(r > mid){
        modifym(rson(p), mid + 1, e, l, r, k);
    }
    push_up(p);
}

void slove(int j){
    if(1 == j){
        int l, r, k;
        scanf("%d%d%d", &l, &r, &k);
        modifym(1, 1, n, l, r, k);
    }
    else if(2 == j){
        int l, r, d;
        scanf("%d%d%d", &l, &r, &d);
        modifya(1, 1, n, l, r, d);
    }
    else if(3 == j){
        int l, r;
        scanf("%d%d", &l, &r);
        long long ans = query(1, 1, n, l, r);
        printf("%lld\n", ans);
    }
}

void Init(){
    build(1, 1, n);
    fill(lam, lam + n * 4 + 1, 1);
}

int main(){
    freopen("out.txt","w",stdout);
    scanf("%d%d%d", &n, &m, &mod);
    Init();
    while(m--){
        int me = 0;
        scanf("%d", &me);
        slove(me);
    }
    return 0;
}

水平还不到家呀,求大佬帮助。

2021/7/29 01:42
加载中...