求助,wa三个点
查看原帖
求助,wa三个点
59289
黑客旋风楼主2021/7/20 09:13
#include<bits/stdc++.h>
using namespace std;
const int mn=100000;
long long sum[4*mn+10],a[mn+10],ADD[4*mn+10],TIME[4*mn+10];
int rd()
{
    int n=0;
    char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')
    {
        n*=10;
        n+=c-'0';
        c=getchar();
    }
    return n;
}
int n,m,q;
void build(int l,int r,int p)
{
    if(l==r)
    {
        sum[p]=a[l];
        TIME[p]=1;
        return ;
    }
    else
    {
        int m=(l+r)>>1;
        build(l,m,p*2);
        build(m+1,r,p*2+1);
        sum[p]=sum[p*2]+sum[p*2+1];
        TIME[p]=1;
    }
}
void add(int l,int r,int p,int k)
{
    ADD[p]+=k;
    ADD[p]%=q;
    sum[p]+=k*(r-l+1);
    sum[p]%=q;
}
void time(int l,int r,int p,int k)
{
    ADD[p]*=k;
    ADD[p]%=q;
    TIME[p]*=k;
    TIME[p]%=q;
    sum[p]*=k;
    sum[p]%=q;
}
void pushdown(int l,int r,int p,int m,bool b)
{
    if(!ADD[p]&&!TIME[p])return;
    if(b)
    {
        add(l,m,p*2,ADD[p]);
        add(m+1,r,p*2+1,ADD[p]);
        ADD[p]=0;
        return;
    }
    else
    {
        time(l,m,p*2,TIME[p]);
        time(m+1,r,p*2+1,TIME[p]);
        TIME[p]=1;
        return;
    }
}
void manyaddchange(int l,int r,int p,int L,int R,int k)
{
    if(L<=l&&r<=R)
    {
        add(l,r,p,k);
        return;
    }
    else
    {
        int m=(l+r)>>1;
        pushdown(l,r,p,m,0);
        pushdown(l,r,p,m,1);

        if(L<=m)manyaddchange(l,m,p*2,L,R,k);
        if(R>m)manyaddchange(m+1,r,p*2+1,L,R,k);
        sum[p]=sum[p*2]+sum[p*2+1];
        sum[p]%=q;
    }
}
void manytimechange(int l,int r,int p,int L,int R,int k)
{
    if(L<=l&&r<=R)
    {
        time(l,r,p,k);
        return;
    }
    else
    {
        int m=(l+r)>>1;
        pushdown(l,r,p,m,0);
        pushdown(l,r,p,m,1);

        if(L<=m)manytimechange(l,m,p*2,L,R,k);
        if(R>m)manytimechange(m+1,r,p*2+1,L,R,k);
        sum[p]=sum[p*2]+sum[p*2+1];
        sum[p]%=q;
    }
}
long long check(int l,int r,int p,int L,int R)
{
    if(L<=l&&r<=R)
    {
        return sum[p];
    }
    int m=(l+r)>>1;
    pushdown(l,r,p,m,0);
    pushdown(l,r,p,m,1);
    long long ans=0;
    if(L<=m)ans+=check(l,m,p*2,L,R);
    if(R>m)ans+=check(m+1,r,p*2+1,L,R);
    return ans;
}
int main()
{
//    freopen("P3373.in","r",stdin);
//    freopen("1.out","w",stdout);
    n=rd();m=rd();q=rd();
    for(int i=1;i<=n;i++)
    {
        a[i]=rd();
    }
    build(1,n,1);
    int p,x,y,k;
    for(int i=1;i<=m;i++)
    {
        p=rd();x=rd();y=rd();
        if(p==1)
        {
            k=rd();
            manytimechange(1,n,1,x,y,k);
        }
        else if(p==2)
        {
            k=rd();
            manyaddchange(1,n,1,x,y,k);
        }
        else
        {
            cout<<check(1,n,1,x,y)%q<<endl;
        }
    }
    return 0;
}

2021/7/20 09:13
加载中...