1. 程式人生 > >模板 - 數據結構 - 線段樹(單點修改)

模板 - 數據結構 - 線段樹(單點修改)

amp ret oid update pan 單點 返回 code ==

這裏是以區間最大值為例,要修改成其他的運算,註意修改每個函數的運算以及query中返回的無關值

這裏的區間最大值設置的最小元素為-1(在query中表示與當前區間不相交的區間的結果)。

註意因為調用的方式傳入l與r是(1,n),所以這個線段樹(包括a)其實是從1開始計數的。

最後,小心爆MAXM

const int MAXM=200000;
int a[MAXM+5],st[(MAXM<<2)+5];
 
void build(int o,int l,int r){
    if(l==r) st[o]=a[l];
    else{
        int m=l+((r-l)>>1
); build(o<<1,l,m); build(o<<1|1,m+1,r); st[o]=max(st[o<<1],st[o<<1|1]); } } void update(int o,int l,int r,int id,int v){ if(l==r) st[o]=v; else{ int m=l+((r-l)>>1); if(id<=m) update(o<<1,l,m,id,v);
else update(o<<1|1,m+1,r,id,v); st[o]=max(st[o<<1],st[o<<1|1]); } } int query(int o,int l,int r,int a,int b){ if(r<a||l>b) return -1; if(a<=l&&r<=b) return st[o]; int m=l+((r-l)>>1); int p1=query(o<<1,l,m,a,b),p2=query(o<<1
|1,m+1,r,a,b); return max(p1,p2); }

模板 - 數據結構 - 線段樹(單點修改)