70分,三个点WA了

P3368 【模板】树状数组 2

``` # 凑合看没加注释线段树的思路~~AC~~ #include<bits/stdc++.h> using namespace std; const int N=10e5+5; long long w[N<<2],a[N],n,m,lzy[N<<2]; void pushup(int u){ w[u]=w[2*u]+w[2*u+1]; } void build(int u,int L,int R){ if(L==R){ w[u]=a[L]; return ; } int mid=(L+R)/2; build(2*u,L,mid); build(2*u+1,mid+1,R); pushup(u); } void update1(int u,int L,int R,int p,int x){ if(L==R){ w[u]+=x; return ; } int mid=(L+R)/2; if(p<=mid) update1(2*u,L,mid,p,x); else update1(2*u+1,mid+1,R,p,x); 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 r<L || R<l; } void maketag(int u,int L,int R,long long x){ lzy[u]+=x; w[u]+=(R-L+1)*x; } void pushdown(int u,int L,int R){ int mid=(L+R)/2; maketag(2*u,L,mid,lzy[u]); maketag(2*u+1,mid+1,R,lzy[u]); lzy[u]=0; } void update(int u,int L,int R,int l,int r,long long x){ if(inRange(L,R,l,r)){ maketag(u,L,R,x); }else if(!outofRange(L,R,l,r)){ int mid=(L+R)/2; pushdown(u,L,R); update(2*u,L,mid,l,r,x); update(2*u+1,mid+1,R,l,r,x); pushup(u); } } long long 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)){ return 0; }else{ int mid=(L+R)/2; pushdown(u,L,R); return query(2*u,L,mid,l,r)+query(2*u+1,mid+1,R,l,r); } } int main(){ int op,x,y,k,wei; cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } build(1,1,n); while(m--){ cin>>op; if(op==1){ cin>>x>>y>>k; update(1,1,n,x,y,k); }else{ cin>>wei; cout<<query(1,1,n,wei,wei)<<endl; } } return 0; } ```
by hpjy_jyc @ 2023-11-21 21:23:43


@[hpjy_jyc](/user/539861) 学完线段树,考古
by Lizichen_licis @ 2024-01-12 22:09:15


@[Lizichen_licis](/user/749811) LZC你能不能不要用这种过于**的结构,为什么你要写个class啊
by QBW1117 @ 2024-03-19 14:16:52


@[QBW1117](/user/933814) 用`class`又会怎样?
by Lizichen_licis @ 2024-03-21 20:29:40


|