//建立线段树所需结构体
struct SegmentTree{
int l, r;
int dat;//该节点的区间最大值
int sum;//该节点的区间总和
}t[SIZE*4];
//建立线段树
void build(int p, int l, int r){
t[p].l = l, t[p].r = r;
if(l == r){
t[p].date = a[l];
return ;
}
int mid = (l + r) / 2;
build(p*2, l, mid);
build(p*2+1, mid + 1, r);
t[p].dat = max(t[p*2].dat, t[p*2+1].dat);
}
//单点修改(最大值)
void change(int p, int x, int v){
if(t[p].l == t[p].r){
t[p].dat == v;
return ;
}
int mid = (t[p].l + t[p].r ) / 2;
if(mid <= x){
change(p*2, x, v);
}
else{
change(p*2+1, x, v);
}
t[p].dat = max(t[p*2].dat, t[p*2+1].dat );
}
//单点修改(区间和)
int search(int p, int l, int r){
if(t[p].l >= l && t[p].r <= r){
return t[p].sum;
}
else if(t[p].l < l || t[p].r > r){
return 0;
}
int s = 0;
if(t[p].r > l) {
s += search(p*2, l, r);
}
if(tree[p].l < r){
s += search(p*2+1, l, r);
}
return s;
}
struct SegmentTree{
int l, r, sum;
}t[1010*4];
//区间查询
int search(int i, int l, int r){
if(t[i].l >= l && t[i].r <= r){
return t[i].sum;
}
if(l > t[i].r || r < t[i].l){
return 0;
}
int ans = 0;
if(t[i*2].r >= l){
ans += search(i*2, l, r);
}
if(t[i*2+1].l <= r){
ans += search(i*2+1, l, r);
}
return s;
}
//单点修改
void add(int i, int dis, int k){
if(t[i].l == t[i].r ){
t[i].sum += k;
return ;
}
if(t[i*2].r > dis){
add(i*2, dis, k);
}
if(t[i*2+1].l < dis){
add(i*2+1, dis, k);
}
t[i].sum += t[i*2].sum + t[i*2+1].sum;
return ;
}
//区间修改
void add(int i, int l, int r, int k){
if(t[i].l >= l && t[i].r <= r){
t[i].sum += k;
}
if(t[i*2].r >= l){
add(i*2, l, r, k);
}
if(t[i*2+1].l <= r){
add(i*2+1, l, r, k);
}
}
//单点查询
void serach(int i; int dis){
ans += t[i].sum;
if(dis <= t[i*2].r){
search(i*2, dis);
}
if(dis >= t[i*2+1].l){
search(i*2+1, dis);
}
}
09-20
11-05