30分WA求调
查看原帖
30分WA求调
546904
pig_16楼主2022/10/27 20:50

不知错在哪,麻烦大佬指点

#include<bits/stdc++.h>
using namespace std;
const int N=1e7 + 100;

typedef long long LL;
LL read()
{
    LL f=1,w=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0')
    {
        w=w*10+ch-'0';
        ch=getchar();
    }
    return f*w;
}


void print(LL x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9)print(x/10);
    putchar(x%10+'0');
}
struct node{
    LL l,r;
    LL sum,add,add2;
}tr[N * 4];
LL a[N];
LL n,m,p;
void pushup(LL u){
    tr[u].sum =(tr[u << 1].sum % p + tr[u<<1 | 1].sum % p) % p;
}
void pushdown(LL u){
    auto &t=tr[u],&l=tr[u << 1],&r=tr[u << 1 | 1];
    l.sum =(l.sum % p * t.add2 % p) % p + ((l.r - l.l +1) % p* t.add % p);
    r.sum =(r.sum % p * t.add2 % p) % p + ((r.r - r.l + 1) % p * t.add % p);
    l.sum %=p;r.sum %=p;
    r.add2 *=(t.add2 % p);
    r.add2 %=p;
    l.add2 *=(t.add2 %p);
    l.add2 %=p;
    
    r.add +=(t.add % p);r.add %=p;
    l.add +=(t.add % p);l.add %=p;
    t.add =0;t.add2=1;
     
}
void build(LL u,LL l,LL r){
    if(l == r) tr[u] = {l,r,a[l] % p,0,1};
    else{
    tr[u]={l,r};
    tr[u].add2 = 1;
    LL mid =l + r >> 1;
    build(u << 1,l,mid);build(u << 1 | 1,mid + 1,r);
    pushup(u);}
}
void modefy1(LL u,LL l,LL r,LL d){
    if(tr[u].l >=l && tr[u].r <= r){
        tr[u].sum += (LL)(tr[u].r - tr[u].l + 1) * d % p;
        tr[u].sum %=p;
        tr[u].add +=d % p;
        tr[u].add %=p;
    }
    else{
    pushdown(u);
    pushup(u);
    LL mid = tr[u].l + tr[u].r >> 1;
    if(l <=mid) modefy1(u<<1,l,r,d);
    if(r > mid) modefy1(u <<1 | 1,l,r,d);
    pushup(u);}
}
void modefy2(LL u,LL l,LL r,LL d){
    if(tr[u].l >=l && tr[u].r <= r){
        tr[u].add *=d % p;
        tr[u].add %=p;
        tr[u].sum *=d % p;
        tr[u].sum %=p;
        tr[u].add2 *=d % p;
        tr[u].add2 %=p;
    }
    else{
    
    pushdown(u);
    pushup(u);
    LL mid = tr[u].l + tr[u].r >> 1;
    if(l <=mid) modefy2(u<<1,l,r,d);
    if(r > mid) modefy2(u <<1 | 1,l,r,d);
    pushup(u);}
}
LL query(LL u,LL l,LL r){
    if(tr[u].l >=l && tr[u].r <=r){
        return tr[u].sum % p;
    }
    LL mid = tr[u].l + tr[u].r >> 1;
    pushdown(u);
    LL sum=0;
    if(l <=mid) sum+=query(u << 1,l,r) % p;
    sum %=p;
    if(r > mid) sum+=query(u << 1 | 1,l,r) % p;
    sum %=p;
    return sum % p;
}
int main(){
    n=read();m=read();p=read();
    //p=571373;
    for(int i=1;i<=n;i++) a[i] = read();
    build(1,1,n);
    
    while(m -- ){
        int x;
        scanf("%d",&x);
        if(x == 1){
            LL ll,rr,dd;
            ll=read();rr=read();dd=read();
            modefy2(1,ll,rr,dd);
        }
        else if(x == 2){
            LL ll,rr,dd;
            ll=read();rr=read();dd=read();
            modefy1(1,ll,rr,dd);
        }
        else if(x == 3){
            LL ll,rr;
            ll=read();rr=read();
            print(query(1,ll,rr) % p);
            putchar('\n');
        }
        
    }
}
2022/10/27 20:50
加载中...