线段树模板

来源:互联网 发布:deepin linux软件中心 编辑:程序博客网 时间:2024/06/06 19:29
struct Line {
    int left;
    int right;
    int cnt;  //延迟标记
}a[MAX];

int n,m,l,r; //n长度,m线段数
int sum;

//函数中的num是节点编号


//构建
void Build(int l, int r, int num) {
    a[num].left = l;
    a[num].right = r;
    a[num].cnt = 0;
    if(l==r)
        return ;
    int mid = (a[num].left + a[num].right)/2;
    Build(l, mid, num*2);
    Build(mid+1, r, num*2+1);
}


//查询
void Query(int l, int r, int num) {
    if(a[num].cnt!=0) {
        sum += a[num].cnt*(r-l+1);
    }
    if(a[num].left == a[num].right)
        return ;
    int mid = (a[num].left + a[num].right)/2;
    if(r<=mid)
        Query(l, r, num*2);
    else if(l>mid)
        Query(l, r, num*2+1);
    else {
        Query(l, mid, num*2);
        Query(mid+1, r, num*2+1);
    }
}


//更新
void Change(int l, int r, int num) {
    if(l==a[num].left && r==a[num].right) {
        a[num].cnt++;
        return ;
    }
    if(a[num].left == a[num].right)
        return ;
    int mid = (a[num].left + a[num].right)/2;
    if(r<=mid)
        Change(l, r, num*2);
    else if(l>mid)
        Change(l, r, mun*2+1);
    else {
        Change(l, mid, num*2);
        Change(mid+1, r, num*2+1);
    }
}

0 0