30分求助 QAQ
查看原帖
30分求助 QAQ
240165
西卡洛斯楼主2021/6/2 00:07
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e5+10;
typedef long long LL;
LL a[N];    
LL n,m,P;
struct Tree
{
    LL l,r,lazya,lazym,sum;
    Tree()
    {
        lazya=0;
        lazym=1;
    }
}tr[N*4];

void pushup(LL u) {tr[u].sum=(tr[u<<1].sum+tr[u<<1|1].sum)%P;}

void pushdown(LL u)
{
    tr[u<<1].lazya=(tr[u<<1].lazya*tr[u].lazym+tr[u].lazya)%P;  
    tr[u<<1|1].lazya=(tr[u<<1|1].lazya*tr[u].lazym+tr[u].lazya)%P;

    tr[u<<1|1].lazym*=tr[u].lazym%P;
    tr[u<<1].lazym*=tr[u].lazym%P;

    tr[u<<1].sum=(tr[u<<1].sum*tr[u].lazym+(tr[u<<1].r-tr[u<<1].l+1)*tr[u].lazya)%P;
    tr[u<<1|1].sum=(tr[u<<1|1].sum*tr[u].lazym+(tr[u<<1|1].r-tr[u<<1|1].l+1)*tr[u].lazya)%P;

    tr[u].lazya=0,tr[u].lazym=1;
}

void build(LL u,LL l,LL r)
{
    tr[u].lazya=0;
    tr[u].lazym=1;
    tr[u].l=l;
    tr[u].r=r;
    if(l==r) {tr[u].sum=a[l]%P;return;}
    LL mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}

LL query(LL u,LL l,LL r)
{
    if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum;
    pushdown(u);
    LL v=0;
    LL mid=tr[u].l+tr[u].r>>1;
    if(l<=mid) v=(v+query(u<<1,l,r))%P;
    if(r>mid) v=(v+query(u<<1|1,l,r))%P;
    return v;
}

void modifya(LL u,LL l,LL r,LL v)
{
    if(tr[u].l>=l&&tr[u].r<=r)
    {
        tr[u].lazya=(tr[u].lazya+v)%P;
        tr[u].sum=(tr[u].sum+(tr[u].r-tr[u].l+1)*v)%P;
    }
    else
    { 
        pushdown(u);
        LL mid=tr[u].l+tr[u].r>>1; 
        if(l<=mid) modifya(u<<1,l,r,v); 
        if(r>mid) modifya(u<<1|1,l,r,v);
        pushup(u);
    } 
}

void modifym(LL u,LL l,LL r,LL v)
{
    if(tr[u].l>=l&&tr[u].r<=r)
    {
        tr[u].lazym=(tr[u].lazym*v)%P;
        tr[u].lazya=(tr[u].lazya*v)%P;
        tr[u].sum=(tr[u].sum*v)%P;
    }
    else
    { 
        pushdown(u);
        tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
        LL mid=tr[u].l+tr[u].r>>1; 
        if(l<=mid) modifym(u<<1,l,r,v); 
        if(r>mid) modifym(u<<1|1,l,r,v);
        pushup(u);
    }
}

int main()
{
    scanf("%lld%lld%lld",&n,&m,&P);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        LL k,x,y,z;
        scanf("%lld",&k);
        if(k==1)
        {
            scanf("%lld%lld%lld",&x,&y,&z);
            modifym(1,x,y,z);
        }
        if(k==2)
        {
            scanf("%lld%lld%lld",&x,&y,&z);
            modifya(1,x,y,z);
        }
        if(k==3)
        {
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",query(1,x,y)); 
        }
    }
    return 0;
}
2021/6/2 00:07
加载中...