如题,问题如下 P3373 看测评记录里面有很多同学,对的和错的数据点都和我一样qwq,自己改了半天一点头绪都没有 求大佬救救!!!
附上代码:
#include<bits/stdc++.h>
#define ll long long int
#define il inline
#define maxn 500001
using namespace std;
ll ans[maxn<<2],tag[maxn<<2],a[maxn],n,m,tax[maxn<<2],p1;
il void read(){
cin>>n>>m>>p1;
for(int i=1;i<=n;i++)cin>>a[i];
}
il ll ls(ll p){
return p<<1;
}
il ll rs(ll p){
return p<<1|1;
}
il void push_up(ll p){
ans[p]=ans[ls(p)]+ans[rs(p)];
}
il void build(ll p,ll l,ll r){
tag[p]=0;
if(l==r){ans[p]=a[l];return;}
ll mid=(l+r)/2;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
il void f(ll p,ll l,ll r,ll k,ll x){
tag[p]+=(x-1)*tag[p]+k;
tag[p]%=p1;
tax[p]*=x;
tax[p]%=p1;
ans[p]*=x;
ans[p]+=k*(r-l+1);
ans[p]%=p1;
}/*应该是这里出问题了qwq
*/
il void push_down(ll p,ll l,ll r){
ll mid=(l+r)/2;
f(ls(p),l,mid,tag[p],tax[p]);
f(rs(p),mid+1,r,tag[p],tax[p]);
tag[p]=0;
tax[p]=1;
}
il void update(ll p,ll nl,ll nr,ll l,ll r,ll k,ll x){
if(nl<=l&&nr>=r){f(p,l,r,k,x);return;}
push_down(p,l,r);
ll mid=(l+r)/2;
if(nl<=mid)update(ls(p),nl,nr,l,mid,k,x);
if(nr>mid)update(rs(p),nl,nr,mid+1,r,k,x);
push_up(p);
}
il ll query(ll p,ll ql,ll qr,ll l,ll r){
ll res=0;
if(ql<=l&&qr>=r){return ans[p];}
push_down(p,l,r);
ll mid=(l+r)/2;
if(ql<=mid)res+=query(ls(p),ql,qr,l,mid)%p1;
if(qr>mid)res+=query(rs(p),ql,qr,mid+1,r)%p1;
return res%p1;
}
int main(){
ll ord,x,y,k,t;
read();
for(int i=1;i<=n;i++)tax[i]=1;
build(1,1,n);
for(int i=1;i<=m;i++){
cin>>ord;
if(ord==1){
cin>>x>>y>>k;
update(1,x,y,1,n,0,k);
}
else if(ord==2){
cin>>x>>y>>k;
update(1,x,y,1,n,k,1);
}
else if(ord==3){cin>>x>>y;
t=query(1,x,y,1,n);
cout<<t<<endl;
}
}
return 0;
}