线段树之快速构树

#include<iostream>
#include<algorithm>
using namespace std;
const int Kmax=200000+10;
struct node{
    int l,r,snv;//节点自带了数据范围
}apple[Kmax<<2];

void pushup(int p){
    apple[p].snv=max(apple[p<<1].snv,apple[p<<1|1].snv);
}

void build(int p,int l,int r){//快速构建线段树,构建与修改分离
    apple[p].l=l;
    apple[p].r=r;
    if(l==r){
        cin>>apple[p].snv;
        return;//别漏
    }
    int mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    pushup(p);
}

int query(int p,int l,int r){
    if(l<=apple[p].l&&apple[p].r<=r){
        return apple[p].snv;
    }
    int res=0;
    int  mid=(apple[p].l+apple[p].r)>>1;
    if(l<=mid){
        res=max(res,query(p<<1,l,r));
    }
    if(mid<r){
        res=max(res,query(p<<1|1,l,r));
    }
    return res;
}

void modify(int p,int x,int y){//单点修改
    if(apple[p].l==apple[p].r&&apple[p].l==x){
        apple[p].snv=y;
        return;
    }
    int  mid=(apple[p].l+apple[p].r)>>1;
    if(x<=mid){
        modify(p<<1,x,y);
    }
    else{
        modify(p<<1|1,x,y);
    }
    pushup(p);
}

int main(){
    std::ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    build(1,1,n);
    char op;
    int x,y;
    for(int i=0;i<m;i++){
        cin>>op>>x>>y;
        if(op=='Q'){
            cout<<query(1,x,y)<<endl;
        }
        else{
            modify(1,x,y);
        }
    }
    return 0;
}

阅读更多
个人分类: 线段树 计蒜客
上一篇线段树需要开4倍区间大小的数组的原因
下一篇线段树之公告板
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭