1. 程式人生 > >線段樹版(單點更新,區間查詢)

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

#define lid (id << 1)
#define rid (id << 1 | 1)

const int N = 100005;
struct Segtree
{
    int l,r;
    int Max,sum;
}tr[4 * N];

int a[N];

void push_up(int id)
{
    tr[id].sum = tr[lid].sum + tr[rid].sum;
    tr[id].Max = max(tr[lid].Max,tr[rid].Max);
}

void build(int id,int l,int r);
{
    tr[id
].l = l; tr[id].r = r; if(l == r) { tr[id].sum = tr[id].Max = a[l]; return; } int mid = (l + r) >> 1; build(lid,l,mid); build(rid,mid + 1,r); push_up(id); } void updata(int id,int x,int v) { if(tr[id].l == tr[id].r) { tr[id].sum = tr[id
].Max = v; return; } int mid = (tr[id].l + tr[id].r) >> 1; updata(x <= mid ? lid : rid,x,v); push_up(id); } int query(int id,int l,int r) { if(tr[id].l == l && tr[id].r == r) return tr[id].sum; int mid = (tr[id].l + tr[id].r) >> 1; if
(r <= mid) return query(lid,l,mid); if(l > mid) return query(rid,mid + 1,r); return query(lid,l,mid) + query(rid,mid + 1,r); }