萌新刚学线段树-114514秒,0pts求调
查看原帖
萌新刚学线段树-114514秒,0pts求调
241542
_OJF_楼主2021/7/13 15:57
#include<bits/stdc++.h>
using namespace std;
long long n, m, p, a[500005], ans;
struct node{
    long long l, r, sum, lazy, mu = 1;
}f[2000005];
void get(int l, int r, int id){
    f[id].l = l, f[id].r = r;
    if(l == r){
        f[id].sum = a[l];
        return;
    }
    int mid = l + (r - l) / 2;
    get(l, mid, id * 2);
    get(mid + 1, r, id * 2 + 1);
    f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
}
void add(int l, int r, int k, int id){
    //cout<<l<<' '<<r<<' '<<id<<' '<<f[id].l<<' '<<f[id].r<<' '<<f[id].lazy<<' '<<f[id].mu<<' '<<f[id].sum<<endl;
    if(l == f[id].l && r == f[id].r){
        f[id].lazy += k;
        return;
    }
    f[id].sum += k * (r - l + 1); 
    if(r <= f[id * 2].r)
        add(l, r, k, id * 2);
    else
        if(l >= f[id * 2 + 1].l)
            add(l, r, k, id * 2 + 1);
        else
            add(l, f[id * 2].r, k, id * 2), add(f[id * 2 + 1].l, r, k, id * 2 + 1);
}
void mul(int l, int r, int k, int id){
    f[id].lazy *= k; 
    if(l == f[id].l && r == f[id].r){
        f[id].mu *= k;
        f[id].lazy *= k;
        f[id].sum *= k;
        //cout<<l<<' '<<r<<' '<<id<<' '<<f[id].l<<' '<<f[id].r<<' '<<f[id].lazy<<' '<<f[id].mu<<' '<<f[id].sum<<endl;
        return;
    }
    if(r <= f[id * 2].r)
        mul(l, r, k, id * 2);
    else
        if(l >= f[id * 2 + 1].l)
            mul(l, r, k, id * 2 + 1);
        else
            mul(l, f[id * 2].r, k, id * 2), mul(f[id * 2 + 1].l, r, k, id * 2 + 1);
    f[id].sum = f[id * 2].sum + f[id * 2 + 1].sum;
    //cout<<l<<' '<<r<<' '<<id<<' '<<f[id].l<<' '<<f[id].r<<' '<<f[id].lazy<<' '<<f[id].mu<<' '<<f[id].sum<<endl;
}
void find(int l, int r, int id){
    //cout<<l<<' '<<r<<' '<<id<<' '<<f[id].l<<' '<<f[id].r<<' '<<f[id].lazy<<' '<<f[id].mu<<' '<<f[id].sum<<endl;
    if(f[id].l == l && f[id].r == r){
        ans += f[id].sum * f[id].mu + f[id].lazy * (r - l + 1);
        return;
    }
    f[id].sum += f[id].lazy * (f[id].r - f[id].l + 1);
    f[id].sum *= f[id].mu;
    f[id * 2].lazy += f[id].lazy, f[id * 2 + 1].lazy += f[id].lazy, f[id].lazy = 0;
    f[id * 2].mu *= f[id].mu, f[id * 2 + 1].mu *= f[id].mu, f[id].mu = 1;
    if(r <= f[id * 2].r)
        find(l, r, id * 2);
    else
        if(l >= f[id * 2 + 1].l)
            find(l, r, id * 2 + 1);
        else
            find(l, f[id * 2].r, id * 2), find(f[id * 2 + 1].l, r, id * 2 + 1);
}
int main(){
    cin>>n>>m>>p;
    for(int i = 1;i <= n;i++)
        scanf("%d", &a[i]);
    get(1, n, 1);
    for(int i = 1;i <= m;i++){
        int op, x, y, k;
        cin>>op>>x>>y;
        if(op == 1)
            cin>>k, mul(x, y, k, 1);
        if(op == 2)
            cin>>k, add(x, y, k, 1);
        if(op == 3){
            ans = 0;
            find(x, y, 1);
            cout<<ans % p<<endl;
        }
    }
    return 0;
}
2021/7/13 15:57
加载中...