0分RE求助悬关
查看原帖
0分RE求助悬关
780034
Nights_watcher楼主2024/7/10 20:47

样例数据,下载的数据本地DEVC++都跑过了,洛谷全部RE,

求助悬关!!!

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ls (now<<1)
#define rs ((now<<1)|1)
#define mid ((l+r)>>1)
#define rd(i) scanf("%lld",&i)
#define pf(i) printf("%lld",i)
#define ed(i) printf("\n")
#define up(now) sum[now]=sum[ls]+sum[rs]
int n,q,mod,opt,x,y,z;
ll sum[400005],la[400005],lm[400005];
void add(ll&x,ll y) {x=(x+y)%mod;}
void mul(ll&x,ll y) {x=(x*y)%mod;}
void build(int now,int l,int r)
{
	lm[now] = 1;
    if(l==r)
    {
        rd(sum[now]);
        return;
    }
    build(ls,l,mid);build(rs,mid+1,r);
    up(now);
}
void change(int now,ll addx,ll mulx,int l,int r)
{
    mul(la[now],mulx);
    add(la[now],addx);
    mul(lm[now],mulx);
    mul(sum[now],mulx);
    add(sum[now],addx*(r-l+1));
}
void push_down(int now,int l,int r)
{
    change(ls,la[now],lm[now],l,mid);
    change(rs,la[now],lm[now],mid+1,r);
    la[now]=0;
    lm[now]=1;
}
void modify(int now,int l,int r,int L,int R,ll addx,ll mulx)
{
    if(L<=l&&r<=R)
    {
        change(now,addx,mulx,l,r);
        return;
    }
    push_down(now,l,r);
    if(L<=mid) modify(ls,l,mid,L,R,addx,mulx);
    if(mid<R) modify(rs,mid+1,r,L,R,addx,mulx);
    up(now); 
}
ll query(int now,int l,int r,int L,int R)
{
    if(L<=l&&r<=R) return sum[now];
    ll ans=0;
    push_down(now,l,r);
    if(L<=mid) add(ans,query(ls,l,mid,L,R));
    if(mid<R) add(ans,query(rs,mid+1,r,L,R));
    return ans;
}
void work()
{
    rd(n);rd(q);rd(mod);
    build(1,1,n);
    while(q--)
    {
        rd(opt);
        if(opt==1)
        {
            rd(x);rd(y);rd(z);
            modify(1,1,n,x,y,0,z);
        }
        else if (opt==2)
        {
            rd(x);rd(y);rd(z);
            modify(1,1,n,x,y,z,1);
        }
        else
        {
            rd(x);rd(y);
            pf(query(1,1,n,x,y));
            ed();
        }
    }
}
int main() {work();}
2024/7/10 20:47
加载中...