樹狀陣列-實戰一(洛谷P3368)
阿新 • • 發佈:2018-11-21
單點更新程式碼:
void add(int a , int b)
{
while(a <= n)
{
tree[a] += b;
a += lowbit(a);
}
}
區間求和程式碼:
int sum(int x)
{
int ans = 0;
while(x != 0)
{
ans += tree[x];
x -= lowbit(x);
}
return ans;
}
主程式碼:
#include<bits/stdc++.h> using namespace std; int n , m; int tree[500001]; int lowbit(int k) { return k & -k; } void add(int a , int b) { while(a <= n) { tree[a] += b; a += lowbit(a); } } int sum(int x) { int ans = 0; while(x != 0) { ans += tree[x]; x -= lowbit(x); } return ans; } int main(void) { int x ,y = 0 , z ,flag; int num; cin>>n>>m; for(int i = 1 ; i <= n ; i ++) { cin>>x; add(i,x-y); y = x; } for(int i = 1 ; i <= m ; i ++) { cin>>flag; if(flag == 1) { cin>>x>>y>>z; add(x,z); add(y+1,-z); } if(flag == 2) { cin>>x; cout<<sum(x)<<endl; } } return 0; }
如有不懂參考如下:
https://blog.csdn.net/qq_33982232/article/details/81273634
https://blog.csdn.net/Small_Orange_glory/article/details/81290634