2015-team4/seg_tree

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
void build(int p,int l,int r){
    if (l==r){
        tr[p]=1;
        return;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    tr[p]=tr[p*2]+tr[p*2+1];
}

void insert(int p,int l,int r,int a,int x){
    int mid=(l+r)/2;
    if (l==r && r==a){
        tr[p]=max(tr[p],x);
        return;
    }
    if (a<=mid) insert(p*2,l,mid,a,x);
    else insert(p*2+1,mid+1,r,a,x);
    tr[p]=max(tr[p*2],tr[p*2+1]);
}

int get_max(int p,int l,int r,int a,int b){
    int mid=(l+r)/2;
    if (l==a && r==b) return tr[p];

    if (b<=mid) return get_max(p*2,l,mid,a,b);
    else if (a>mid) return get_max(p*2+1,mid+1,r,a,b);
    else{
        int t1=get_max(p*2,l,mid,a,mid);
        int t2=get_max(p*2+1,mid+1,r,mid+1,b);
        return max(t1,t2);
    }
}
}}}
void build(int p,int l,int r){
    if (l==r){
        tr[p]=1;
        return;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    tr[p]=tr[p*2]+tr[p*2+1];
}
void insert(int p,int l,int r,int a,int x){
    int mid=(l+r)/2;
    if (l==r && r==a){
        tr[p]=max(tr[p],x);
        return;
    }
    if (a<=mid) insert(p*2,l,mid,a,x);
    else insert(p*2+1,mid+1,r,a,x);
    tr[p]=max(tr[p*2],tr[p*2+1]);
}
int get_max(int p,int l,int r,int a,int b){
    int mid=(l+r)/2;
    if (l==a && r==b) return tr[p];
    if (b<=mid) return get_max(p*2,l,mid,a,b);
    else if (a>mid) return get_max(p*2+1,mid+1,r,a,b);
    else{
        int t1=get_max(p*2,l,mid,a,mid);
        int t2=get_max(p*2+1,mid+1,r,mid+1,b);
        return max(t1,t2);
    }
}