样例没过求助dalao (玄关
查看原帖
样例没过求助dalao (玄关
117948
xuzhenyao楼主2024/12/18 22:03

没找到问题QAQ

#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define ll long long
using namespace std;
struct tree
{
    ll val,lazy1,lazy2;// lazy1 +; lazy2 *
}e[500005];
ll a[100005];
ll n,m,mod;
ll read()
{
    ll x=0,fu=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
        if(c=='-') fu=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        x=(x<<3)+(x<<1)+c-'0';
        c=getchar();
    }
    return x*fu;
}
ll ls(ll p)
{
    return p<<1;
}
ll rs(ll p)
{
    return p<<1|1;
}
void pushup(ll p)
{
    e[p].val=(e[ls(p)].val+e[rs(p)].val)%mod;
    return;
}
void pushdown(ll p,ll x,ll y)
{
    ll mid=(x+y)>>1,k1=e[p].lazy1,k2=e[p].lazy2;
    e[ls(p)].val=(e[ls(p)].val*k2+k1*(mid-x+1))%mod;
    e[ls(p)].lazy1=(e[ls(p)].lazy1*k2+k1)%mod; e[ls(p)].lazy2=(k2*e[ls(p)].lazy2)%mod;
    e[rs(p)].val=(e[rs(p)].val*k2+k1*(y-mid))%mod;
    e[rs(p)].lazy1=(e[rs(p)].lazy1*k2+k1)%mod; e[rs(p)].lazy2=(k2*e[rs(p)].lazy2)%mod;
    e[p].lazy1=0; e[p].lazy2=1;
    return;
}
void creat(ll p,ll x,ll y)
{
    if(x>=y)
    {
        e[p].val=a[y];
        e[p].lazy1=0; e[p].lazy2=1;
        return;
    }
    int mid=(x+y)>>1;
    creat(ls(p),x,mid); creat(rs(p),mid+1,y);
    pushup(p);
}
void updateadd(ll el,ll er,ll x,ll y,ll p,ll k)
{
    if(el<=x&&y<=er)
    {
        e[p].val=(e[p].val+k*(y-x+1))%mod;
        e[p].lazy1=(k+e[p].lazy1)%mod;
        return;
    }
    pushdown(p,x,y);
    ll mid=(x+y)>>1;
    if(el<=mid) updateadd(el,er,x,mid,ls(p),k);
    if(er>mid) updateadd(el,er,mid+1,y,rs(p),k);
    pushup(p);
}
void updatemul(ll el,ll er,ll x,ll y,ll p,ll k)
{
    if(el<=x&&y<=er)
    {
        e[p].val=(k*e[p].val)%mod;
        e[p].lazy1=(k*e[p].lazy1)%mod;
        e[p].lazy2=(k*e[p].lazy2)%mod;
        return;
    }
    pushdown(p,x,y);
    ll mid=(x+y)>>1;
    if(el<=mid) updatemul(el,er,x,mid,ls(p),k);
    if(er>mid) updatemul(el,er,mid+1,y,rs(p),k);
    pushup(p);
}
ll query(ll el,ll er,ll x,ll y,ll p)
{
    if(el<=x&&y<=er)
        return e[p].val%mod;
    pushdown(p,x,y);
    ll mid=(x+y)>>1,sum=0;
    if(el<=mid) sum=(sum+query(el,er,x,mid,ls(p)))%mod;
    if(er>mid) sum=(sum+query(el,er,mid+1,y,rs(p)))%mod;
    return sum;
}
int main()
{
    n=read(); m=read(); mod=read();
    for(int i=1;i<=n;++i)
        a[i]=read();
    creat(1,1,n);
    for(int i=1;i<=m;++i)
    {
        ll book=read(),x=read(),y=read();
        if(book==3)
            printf("%lld\n",query(x,y,1,n,1));
        if(book==2)
        {
            ll k=read();
            updateadd(x,y,1,n,1,k);
        }
        if(book==1)
        {
            ll k=read();
            updatemul(x,y,1,n,1,k);
        }
    }
    return 0;
}
2024/12/18 22:03
加载中...