線段樹應用(建樹 單點更新 區間求和)

2021-10-01 07:35:00 字數 872 閱讀 4736

【問題描述】

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

【輸入格式】

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

以下是m行,每行有三個正整數k,a,b(k=0或1、 a,b<=n)。k=0時表示將a處數字加上b,k=1時表示詢問區間[a,b]內所有數的和。

【輸出格式】

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

【程式**】

#includeusing namespace std;

const int maxn=100001;

int n,m,a[maxn],seg[maxn*4];//線段樹陣列要開大4倍

void pushup(int cur)

void build(int cur,int l,int r)

}void update(int cur,int l,int r,int x,int val)

int mid=(l+r)/2;

if(x<=mid)

update(cur<<1,l,mid,x,val);

else

update(cur<<1|1,mid+1,r,x,val);

pushup(cur);

}int rangesum(int cur,int l,int r,int x,int y)

int main() {

int a,b,c;

cin>>n>>m;

build(1,1,n);

while(m--) {

cin>>a>>b>>c;

if(a==0) update(1,1,n,b,c);

else cout<

【參考文獻】

單點更新,區間查詢線段樹

線段樹的空間複雜度是4n include include include using namespace std const int maxn 100005 const int inf 0x3f3f3f3f int n,a maxn struct node 結點 tree maxn 4 樹結點儲存陣...

線段樹 學習 模板 單點更新 區間更新

線段樹是幹什麼的?有一列數,每次可以進行以下三種操作中的一種 1 給指定區間中的每個數都加上某個值 2 將指定區間內的所有數置成某乙個統一的值 3 詢問乙個區間上的最小值 最大值 所有數的和。樸素做法怎麼做?用線性表儲存,每種操作,對待處理或待詢問區間中的每個元素都逐一進行處理。複雜度多少?假設這個...

I Hate It 線段樹單點更新區間查詢

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。input 本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個...