C81【模板】树状数组 点修+区查 区修+点查
C81【模板】树状数组 点修+区查 区修+点查_哔哩哔哩_bilibili



// 树状数组 点修+区查 O(nlogn) #include<bits/stdc++.h> using namespace std; const int N=500010; int n,m; struct BIT{ int s[N]; //区间和 void change(int x,int w){ for(;x<=n;x+=x&-x) s[x]+=w; } int query(int x){ int res=0; for(;x;x-=x&-x) res+=s[x]; return res; } }T; int main(){ ios::sync_with_stdio(0); cin>>n>>m; int op,x,y,k; for(int i=1;i<=n;i++) cin>>k, T.change(i,k); for(int i=1;i<=m;i++){ cin>>op>>x; if(op==1) cin>>k, T.change(x,k); else cin>>y, cout<<T.query(y)-T.query(x-1)<<"\n"; } }
// 树状数组 区修+点查 O(nlogn) #include<bits/stdc++.h> using namespace std; const int N=500010; int n,m,a[N]; struct BIT{ int s[N]; //差分的区间和 void change(int x,int w){ for(;x<=n;x+=x&-x) s[x]+=w; } int query(int x){ int res=0; for(;x;x-=x&-x) res+=s[x]; return res; } }T; int main(){ ios::sync_with_stdio(0); cin>>n>>m; int op,x,y,k; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++){ cin>>op>>x; if(op==1){ cin>>y>>k; T.change(x,k); T.change(y+1,-k); //差分 } else cout<<T.query(x)+a[x]<<"\n"; } }
树状数组(BIT)—— 一篇就够了 - Last_Whisper - 博客园
浙公网安备 33010602011771号