由于学校32位垃圾电脑运行大样例直接爆炸,且你谷IDE无法运行大样例,所以蒟蒻根本不知道问题出在哪里了。
看讨论发现很多30pts的,但是对比之后并没有发现蒟蒻有哪些错误。
请问有没有大佬可以帮忙看看蒟蒻的代码,或者提供前车之鉴呢,谢谢各位大佬了QWQ
#include<iostream>
#include<cstdio>
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,p;
struct edgetree{
int l,r;
long long sum;
int xla,jla;
}tr[N<<2];
struct doo{
void pushup(int x){
tr[x].sum=(tr[x<<1].sum+tr[x<<1|1].sum)%p;
}
void plusit(int x,int k){
tr[x].sum=(tr[x].sum+(long long)(tr[x].r-tr[x].l+1)*k%p)%p;
tr[x].jla=(tr[x].jla+k)%p;
}
void timesit(int x,int k){
tr[x].sum=(long long)tr[x].sum*k%p;
tr[x].jla=(long long)tr[x].jla*k%p;
tr[x].xla=(long long)tr[x].xla*k%p;
}
void pushdown(int x){
if(tr[x].xla!=1){
timesit(x<<1,tr[x].xla);
timesit(x<<1|1,tr[x].xla);
tr[x].xla=1;
}
if(tr[x].jla!=0){
plusit(x<<1,tr[x].jla);
plusit(x<<1|1,tr[x].jla);
tr[x].jla=0;
}
return;
}
void build(int x,int l,int r){
tr[x].l=l;
tr[x].r=r;
tr[x].jla=0;
tr[x].xla=1;
if(tr[x].l==tr[x].r){
scanf("%lld",&tr[x].sum);
return;
}
int mid=(tr[x].l+tr[x].r)>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
return;
}
void cf(int x,int l,int r,int z){
if(l<=tr[x].l&&tr[x].r<=r){
timesit(x,z);
return;
}
pushdown(x);
int mid=(tr[x].l+tr[x].r)>>1;
if(l<=mid){
cf(x<<1,l,r,z);
}
if(r>mid){
cf(x<<1|1,l,r,z);
}
pushup(x);
return;
}
void jf(int x,int l,int r,int z){
if(l<=tr[x].l&&tr[x].r<=r){
plusit(x,z);
return;
}
pushdown(x);
int mid=(tr[x].l+tr[x].r)>>1;
if(l<=mid){
jf(x<<1,l,r,z);
}
if(r>mid){
jf(x<<1|1,l,r,z);
}
pushup(x);
return;
}
long long query(int x,int l,int r){
long long res=0;
if(l<=tr[x].l&&tr[x].r<=r){
return tr[x].sum%p;
}
pushdown(x);
int mid=(tr[x].l+tr[x].r)>>1;
if(l<=mid){
res+=query(x<<1,l,r)%p;
}
if(r>mid){
res+=query(x<<1|1,l,r)%p;
}
pushup(x);
return res;
}
}tree;
int main(){
scanf("%d%d%d",&n,&m,&p);
int op,x,y,k;
tree.build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&op,&x,&y);
if(op==1){
scanf("%d",&k);
tree.cf(1,x,y,k);
}
else if(op==2){
scanf("%d",&k);
tree.jf(1,x,y,k);
}
else{
//cout<<"11111111111111111"<<endl;
printf("%lld\n",tree.query(1,x,y));
}
}
}