//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 內所有數的和。對於每個詢問輸出對應的答...