線段樹單點修改區間查詢

2021-10-09 20:06:16 字數 1616 閱讀 9331

這是一道模板題。

給定數列 a[1],a[2],…,a[n],你需要依次進行 qq 個操作,操作有兩類:

1 i x:給定 i,x,將 a[i] 加上 x;

2 l r:給定 l,r,求 ∑ri=la[i]的值(換言之,求 a[l]+a[l+1]+⋯+a[r] 的值)。

input

第一行包含 2 個正整數 n,q,表示數列長度和詢問個數。保證 1≤n,q≤106。

第二行 n 個整數 a[1],a[2],…,a[n]表示初始數列。保證 |a[i]|≤106。

接下來 q 行,每行乙個操作,為以下兩種之一:

1 i x:給定 i,x,將 a[i] 加上 x;

2 l r:給定 l,r,求 ∑ri=la[i] 的值。

保證 1≤l≤r≤n, |x|≤106。

output

對於每個 2 l r 操作輸出一行,每行有乙個整數,表示所求的結果。

example

樣例輸入

321

2312

0213

樣例輸出

6
hint

對於所有資料,1≤n,q≤106,1≤n,q≤106, |a[i]|≤106|a[i]|≤106, 1≤l≤r≤n,1≤l≤r≤n, |x|≤106|x|≤106。

題意·:

有乙個數列,讓你對該數列的某些數修改後,輸出區間中數的和

題解:線段樹模板題,對於乙個數列,將其中的數存入線段樹中,對於每乙個根節點,其值為左樹和右樹的和

比如數列 1,2,3,4,5,6,7,8,9,10;建成線段樹後為

其樹狀陣列儲存為55,15,40,6,9,21,19,3,3,4,5,13,8,9,10,1,2,0,0,0,0,0,0,6,7,0,0,0,0,0,0;

其中0是開了空間,但是並沒有賦值;

對於乙個根節點x,其左節點為x2,右節點為x2+1

**:

#include

"stdio.h"

int arr[

1000010];

long

long tree[

5000010];

void

build_tree

(int node,

int start,

int end)

//建樹

}void

update_tree

(int node,

int start,

int end,

int idx,

int val)

//單點修改

else

}long

long

query_tree

(int node,

int start,

int end,

int l,

int r)

//區間查詢

}int

main()

}}return0;

}

線段樹模板(單點修改 區間查詢)

1547 例 1 區間和 時間限制 1000 ms 記憶體限制 524288 kb 提交數 2072 通過數 639 題目描述 給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。輸入 輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數...

I Hate It 線段樹 單點修改 區間查詢

time limit 9000 3000 ms j a others memory limit 32768 32768 k j a others total submission s 40034 accepted submission s 15898 很多學校流行一種比較的習慣。老師們很喜歡詢問,從...

HDU1166 線段樹 單點修改區間查詢

c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生...