線段樹(區間更新求和)

2021-06-21 20:08:31 字數 1137 閱讀 9961

//poj 3468

#include

using namespace std;

#define max 100100

struct node

//求區間長度

int get_dis()

};node tree[max * 3];

long long d[max];

//建樹

long long build(int left, int right, int loc)

int mid = tree[loc].get_mid();

return tree[loc].sum = build(left, mid, ll) + build(mid + 1, right, rr);

}//更新節點

void update(int left, int right, long long value, int loc)

//不管要更新的區間位於什麼位置上,根節點的值必定增加((right - left + 1) * value);

tree[loc].sum += (long long)(right - left + 1) * value;

//遞迴更新左右節點

int mid = tree[loc].get_mid();

if (right <= mid) else if (mid < left) else

}//查詢區間值

long long query(int left, int right, int loc)

//區間有增量

if (tree[loc].add)

//遞迴查詢左右子樹

int mid = tree[loc].get_mid();

if (right <= mid) else if (mid < left) else

}int main()

build(1, n, 1);

char op[5];

int a, b, c;

while (q--)

printf("%lld\n", query(a, b, 1));

} else

update(a, b, c, 1);}}

}return 0;

}

線段樹(區間求和,區間加,單點更新等)

線段樹是一種二叉搜尋樹。它將一段區間劃分為若干個單位區間,每乙個節點都儲存著乙個區間。線段樹可做 區間求和,區間最值,區間更新,單點更新等操作 以區間和為例來做介紹 建樹const int maxn 1000000 5 struct treetree maxn 2 把子節點的資訊彙總到了父節點上,根...

線段樹(區間求和,區間加,單點更新等)

線段樹是一種二叉搜尋樹。它將一段區間劃分為若干個單位區間,每乙個節點都儲存著乙個區間。線段樹可做 區間求和,區間最值,區間更新,單點更新等操作 以區間和為例來做介紹 建樹const int maxn 1000000 5 struct treetree maxn 2 把子節點的資訊彙總到了父節點上,根...

線段樹 區間求和

給定一數列,規定有兩種操作,一是修改某個元素,二是求區間的連續和。輸入資料第一行包含兩個正整數n,m n 100000,m 500000 以下是m行,每行有三個正整數k,a,b k 0或1,a,b n k 0時表示將a處數字加上b,k 1時表示詢問區間 a,b 內所有數的和。對於每個詢問輸出對應的答...