求救! 把洛谷进阶版的线段树板子改了改,但是没看出来问题在哪,感觉可能是没pushdown对?问题应该出现在pushdown或其之后
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int MAXN=1e5+5;
int a[MAXN],w[MAXN*4],lzyk[MAXN*4],lzyd[MAXN*4],n,m;
void pushup(const int u){
w[u]=w[u*2]+w[u*2+1];
}
void build(const int u,int l,int r){
if(l==r){
w[u]=a[l];
return;
}
int mid=(l+r)>>1;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
pushup(u);
}
bool inrange(int L,int R,int l,int r){
return l<=L && r>=R;
}
bool outofrange(int L,int R,int l,int r){
return L>r || R<l;
}
int sum(int k,int d,int len){
int a1=k,an=k+d*(len-1);
return (a1+an)*len/2;
}
void maketag(int u,int l,int r,int k,int d){
lzyk[u]+=k;lzyd[u]+=d;
w[u]+=sum(k,d,r-l+1);
}
void pushdown(int u,int l,int r){
int mid=(l+r)>>1;
maketag(u*2,l,mid,lzyk[u],lzyd[u]);
maketag(u*2+1,mid+1,r,lzyk[u]+lzyd[u]*(mid-l+1),lzyd[u]);
lzyk[u]=0,lzyd[u]=0;
}
int query(int u,int L,int R,int l,int r){
if(inrange(L,R,l,r)) return w[u];
else if(!outofrange(L,R,l,r)){
int mid=(L+R)>>1;
pushdown(u,L,R);
return query(u*2,L,mid,l,r)+query(u*2+1,mid+1,R,l,r);
}
else return 0;
}
void update(int u,int L,int R,int l,int r,int k,int d){
if(inrange(L,R,l,r)){
maketag(u,L,R,k,d);
}
else if(!outofrange(L,R,l,r)){
int mid=(L+R)>>1;
pushdown(u,L,R);
update(u*2,L,mid,l,r,k,d);
update(u*2+1,mid+1,R,l,r,k,d);
pushup(u);
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(m--){
int opt;
cin>>opt;
if(opt==1){
int l,r,k,d;cin>>l>>r>>k>>d;
update(1,1,n,l,r,k,d);
// for(int i=1;i<=n*4;i++) cout<<i<<" "<<w[i]<<endl;
// for(int i=1;i<=n;i++) cout<<query(1,1,n,i,i)<<" ";
}
else{
int p;cin>>p;
cout<<query(1,1,n,p,p)<<endl;
}
}
return 0;
}