写的数组的线段树 调的要崩溃了TT到后面都对着老师的代码一行行对了,结果还是只有90分,老师的代码只有95分 求助TT
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,m;
int a[1000005];
int top;
struct st{
int l,r;
ll d,tag;
int ls,rs;
}pool[2000005];
ll cal(int p){
return pool[p].d+pool[p].tag*(pool[p].r-pool[p].l+1);
}
void pushup(int p){
pool[p].d=cal(pool[p].ls)+cal(pool[p].rs);
}
void pushd(int p){
if(pool[p].tag==0) return;
pool[pool[p].ls].tag+=pool[p].tag;
pool[pool[p].rs].tag+=pool[p].tag;
pool[p].tag=0;
pushup(p);
}
int build(int l,int r){
int p=++top;
pool[p]=st{l,r,0,0};
if(l==r){
pool[p].d=a[l];
return p;
}
int mid=(l+r)/2;
pool[p].ls=build(l,mid);
pool[p].rs=build(mid+1,r);
pushup(p);
return p;
}
ll query(int p,int ql,int qr){
if(pool[p].l==ql && pool[p].r==qr){
return cal(p);
}
pushd(p);
int mid=(pool[p].l+pool[p].r)/2;
if(ql>=mid+1) return query(pool[p].rs,ql,qr);
else if(qr<=mid) return query(pool[p].ls,ql,qr);
else{
ll ld=query(pool[p].ls,ql,mid);
ll rd=query(pool[p].rs,mid+1,qr);
return ld+rd;
}
}
void change(int p,int ql,int qr,int dv){
if(pool[p].l==ql && pool[p].r==qr){
pool[p].tag+=dv;
return;
}
pushd(p);
int mid=(pool[p].l+pool[p].r)/2;
if(ql>=mid+1) change(pool[p].rs,ql,qr,dv);
else if(qr<=mid) change(pool[p].ls,ql,qr,dv);
else{
change(pool[p].ls,ql,mid,dv);
change(pool[p].rs,mid+1,qr,dv);
}
pushup(p);
return;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int rt = build(1,n);
int op,l,r;
ll k;
for(int i=1;i<=m;i++){
cin>>op>>l>>r;
if(op==1){
cin>>k;
change(rt,l,r,k);
} else{
cout<<query(rt,l,r)<<"\n";
}
}
return 0;
}