線段樹之sum

2022-08-05 13:09:11 字數 1457 閱讀 5613

time limit: 1 sec  memory limit: 128 mb

submit: 54  solved: 47

[submit][status][web board][edit] [testdata]

給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。 

輸入資料第一行包含兩個正整數n,m(n<=100000,m<=500000),以下是m行, 

每行有三個正整數k,a,b(k=0或1, a,b<=n).

k=0時表示將a處數字加上b,k=1時表示詢問區間[a,b]內所有數的和。

對於每個詢問輸出對應的答案。

10 20

0 1 10

1 1 4

0 6 6

1 4 10

1 8 9

1 4 9

0 10 2

1 1 8

0 2 10

1 3 9

0 7 8

0 3 10

0 1 1

1 3 8

1 6 9

0 5 5

1 1 8

0 4 2

1 2 8

0 1 1

1060

616624

1450

41

最簡單的線段樹

1 #include2

using

namespace

std;

3int

ans;

4struct

segment_tree

13int mid=(l+r)/2;14

if(a<=mid)

15 update(num*2

,l,mid,a,b);

16if(a>mid)

17 update(num*2+1,mid+1

,r,a,b);

18 tree[num]=tree[num*2]+tree[num*2+1

];19}20

void query(int num,int l,int r,int a,int

b)21

27if(l>=a && r<=b)

2832

int mid=(l+r)/2;33

if(a<=mid)

34 query(num*2

,l,mid,a,b);

35if(b>mid)

36 query(num*2+1,mid+1

,r,a,b);

37return;38

}39}s;40

intmain()

4155}56

return0;

57 }

sum