1. 程式人生 > >Luogu【模板】樹狀數組

Luogu【模板】樹狀數組

line () using std res ++ cst printf https

https://www.luogu.org/problemnew/show/P3374

單點修改, 區間查詢

 1 //2018年2月18日17:58:16
 2 #include <iostream>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int N = 500001;
 7 int n, m;
 8 int a[N], c[N];
 9 
10 inline int lowbit(int x){
11     return x & (-x);
12 }
13 void add(int x, int k){
14 for(int i=x;i<=n;i+=lowbit(i)) c[i] += k; 15 } 16 17 int sum(int x){ 18 int res = 0; 19 for(int i=x; i; i-=lowbit(i)) res += c[i]; 20 return res; 21 } 22 23 int main(){ 24 scanf("%d%d", &n, &m); 25 for(int i=1;i<=n;i++){ 26 scanf("%d", &a[i]); 27
add(i, a[i]); 28 } 29 for(int i=1;i<=m;i++){ 30 int opt, x, k; 31 scanf("%d%d%d", &opt, &x, &k); 32 if(opt == 1){ 33 add(x, k); 34 }else if(opt == 2){ 35 printf("%d\n", sum(k)-sum(x-1)); 36 } 37 } 38 39
40 return 0; 41 }

https://www.luogu.org/problemnew/show/P3368

區間修改, 單點查詢

 1 //2018年2月18日21:10:31
 2 #include <iostream>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 const int N = 500001;
 7 int n, m;
 8 int c[N], last;
 9 int opt, x, y, k;
10 
11 inline int lowbit(int x){
12     return x & (-x);
13 }
14 
15 void add(int x, int k){
16     for(int i=x; i<=n; i+=lowbit(i)) c[i] += k;
17 }
18 
19 int sum(int x){
20     int res = 0;
21     for(int i=x; i; i-=lowbit(i)) res += c[i];
22     return res;
23 }
24 
25 int main(){
26     scanf("%d%d", &n, &m);
27     for(int i=1;i<=n;i++){
28         scanf("%d", &x);
29         add(i, x-last);
30         last = x;
31     }
32     for(int i=1;i<=m;i++){
33         scanf("%d", &opt);
34         if(opt == 1){
35             scanf("%d%d%d", &x, &y, &k);
36             add(x, k);
37             add(y+1, -k);
38         }else if(opt == 2){
39             scanf("%d", &x);
40             printf("%d\n", sum(x));
41         }
42     }
43     
44     return 0;
45 }

Luogu【模板】樹狀數組