30pts 过了1,3,4 求大佬帮助
查看原帖
30pts 过了1,3,4 求大佬帮助
227723
syysongyuyang楼主2022/7/29 11:50

代码贴在这里

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n,m,p;
ll a[N],d[N<<2],b1[N<<2],b2[N<<2];
struct SegmentTree{
    inline void build(ll u,ll l,ll r)
    {
        if (l==r)
        {
            d[u]=a[l];
            return ;
        }
        ll mid=l+((r-l) >> 1);
        build(u<<1,l,mid),build(u<<1 | 1,mid+1,r);
        d[u]=d[u<<1]+d[u<<1 | 1];
    }
    inline void update1(ll u,ll l,ll r,ll s,ll t,ll c)
    {
        if (l<=s && t<=r)
        {
            d[u]*=c%p;d[u]%=p;b2[u]*=c;b2[u]%=p;b1[u]*=c;b1[u]%=p;
            return ;
        }
        ll mid=s+((t-s) >> 1);
        if (b2[u]!=1)
        {
            d[u<<1]=d[u<<1]*b2[u]%p;d[u<<1]%=p;
            d[u<<1 | 1]=d[u<<1 | 1]*b2[u]%p,d[u<<1 | 1]%=p;
            b2[u<<1]*=b2[u]%p,b2[u<<1 | 1]*=b2[u]%p;
            b1[u<<1]*=b2[u]%p,b1[u<<1 | 1]*=b2[u]%p;
            b2[u<<1]%=p,b2[u<<1 | 1]%=p;b1[u<<1]%=p;b2[u<<1 | 1]%=p;
        }
        b2[u]=1;
        if (b1[u])
        {
            d[u<<1]+=(mid-s+1)*b1[u]%p;d[u<<1]%=p;
            d[u<<1 | 1]+=(t-mid)*b1[u]%p;d[u<<1 | 1]%=p;
            b1[u<<1]+=b1[u],b1[u<<1 | 1]+=b1[u];
            b1[u<<1]%=p,b1[u<<1 | 1]%=p;
        }
        b1[u]=0;
        if (l<=mid)
            update1(u<<1,l,r,s,mid,c);
        if (r>mid)
            update1(u<<1 | 1,l,r,mid+1,t,c);
        d[u]=(d[u<<1]+d[u<<1 | 1])%p;
    }
    inline void update2(ll u,ll l,ll r,ll s,ll t,ll c)
    {
        if (l<=s && t<=r)
        {
            d[u]+=(t-s+1)*c%p;d[u]%=p;b1[u]+=c;b1[u]%=p;
            return ;
        }
        ll mid=s+((t-s) >> 1);
        if (b2[u]!=1)
        {
            d[u<<1]=d[u<<1]*b2[u]%p;d[u<<1]%=p;
            d[u<<1 | 1]=d[u<<1 | 1]*b2[u]%p,d[u<<1 | 1]%=p;
            b2[u<<1]*=b2[u]%p,b2[u<<1 | 1]*=b2[u]%p;
            b1[u<<1]*=b2[u]%p,b1[u<<1 | 1]*=b2[u]%p;
            b2[u<<1]%=p,b2[u<<1 | 1]%=p;b1[u<<1]%=p;b2[u<<1 | 1]%=p;
        }
        b2[u]=1;
        if (b1[u])
        {
            d[u<<1]+=(mid-s+1)*b1[u]%p;d[u<<1]%=p;
            d[u<<1 | 1]+=(t-mid)*b1[u]%p;d[u<<1 | 1]%=p;
            b1[u<<1]+=b1[u],b1[u<<1 | 1]+=b1[u];
            b1[u<<1]%=p,b1[u<<1 | 1]%=p;
        }
        b1[u]=0;
        if (l<=mid)
            update2(u<<1,l,r,s,mid,c);
        if (r>mid)
            update2(u<<1 | 1,l,r,mid+1,t,c);
        d[u]=(d[u<<1]+d[u<<1 | 1])%p;
    }
    inline ll getsum(ll u,ll l,ll r,ll s,ll t)
    {
        if (l<=s && t<=r) return d[u]%p;
        ll mid=s+((t-s) >> 1);
        if (b2[u]!=1)
        {
            d[u<<1]=d[u<<1]*b2[u]%p;d[u<<1]%=p;
            d[u<<1 | 1]=d[u<<1 | 1]*b2[u]%p,d[u<<1 | 1]%=p;
            b2[u<<1]*=b2[u]%p,b2[u<<1 | 1]*=b2[u]%p;
            b1[u<<1]*=b2[u]%p,b1[u<<1 | 1]*=b2[u]%p;
            b2[u<<1]%=p,b2[u<<1 | 1]%=p;b1[u<<1]%=p;b2[u<<1 | 1]%=p;
        }
        b2[u]=1;
        if (b1[u])
        {
            d[u<<1]+=(mid-s+1)*b1[u]%p;d[u<<1]%=p;
            d[u<<1 | 1]+=(t-mid)*b1[u]%p;d[u<<1 | 1]%=p;
            b1[u<<1]+=b1[u],b1[u<<1 | 1]+=b1[u];
            b1[u<<1]%=p,b1[u<<1 | 1]%=p;
        }
        b1[u]=0;
        ll sum=0;
        if (l<=mid)
            sum+=getsum(u<<1,l,r,s,mid)%p;
        sum%=p;
        if (r>mid)
            sum+=getsum(u<<1 | 1,l,r,mid+1,t)%p;
        sum%=p;
        d[u]=(d[u<<1]+d[u<<1 | 1])%p;
        return sum;
    }
};
inline ll read(){
    ll s=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-') {f=-1;} ch=getchar();}
    while(isdigit(ch)) {s=(s<<1)+(s<<3)+ch-'0'; ch=getchar();}
    return s*f;
}
inline void write(int x){
    int top=0,sta[35];
    while(x) {sta[top++]=x%10,x/=10;}
    while(top) {putchar(sta[--top]+'0');}
}

int main()
{
    SegmentTree segtree;
    n=read();m=read(),p=read();
    for (int i=1;i<=n;i++) {a[i]=read();}
    for (int i=1;i<=n;i++) {b2[i]=1;}
    segtree.build(1,1,n);
    for (int i=1;i<=m;i++)
    {
        ll op=read();
        if (op==1)
        {
            ll x=read(),y=read(),k=read();
            segtree.update1(1,x,y,1,n,k);
        }
        else if (op==2)
        {
            ll x=read(),y=read(),k=read();
            segtree.update2(1,x,y,1,n,k);
        }
        else if (op==3)
        {
            ll x=read(),y=read();
            printf("%lld\n",segtree.getsum(1,x,y,1,n)%p);
        }
    }
    return 0;
}
2022/7/29 11:50
加载中...