线段树(HDU 1754 I Hate It)

谁说胖子不能爱 提交于 2020-02-28 16:46:02

第一次写线段树,参考了一下别人的线段树代码

#define L(x) (x << 1)
#define R(x) ((x << 1) | 1)

code:

#include <stdio.h>
#define max(x,y) x>y?x:y
const int MAX = 200005;
struct Tree{
    int left; int right; int data;
}tr[MAX*3];
int n,m,s[MAX],a,b;
char cmd;
void build(int l,int r,int pos){
    tr[pos].left = l;
    tr[pos].right = r;
    if(l == r){
        tr[pos].data = s[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(l,mid,(pos<<1));
    build(mid+1,r,(pos<<1)+1);
    tr[pos].data = max(tr[pos<<1].data,tr[(pos<<1)+1].data);
}
void Update(int l,int r,int pos){
    if(l == r){
        tr[pos].data = b; return
    }
    int mid = (l + r) >> 1;
    if(a <= mid)    {
        Update(l,mid,pos<<1);
    }else if (a > mid){
        Update(mid+1,r,(pos<<1)+1);
    } 
    tr[pos].data = max(tr[pos<<1].data,tr[(pos<<1)+1].data);
}
int Query(int sta,int end,int pos){
    if(tr[pos].left == sta && tr[pos].right == end)
        return tr[pos].data;
    int mid = (tr[pos].left + tr[pos].right)>>1;
    if(end <= mid){
        return Query(sta,end,pos<<1);
    }
    else if(sta > mid){
        return Query(sta,end,(pos<<1)+1);
    }else{
        int x = Query(sta,mid,pos<<1);
        int y = Query(mid+1,end,(pos<<1)+1);
        return max(x,y);
    }
}
int main(){
    int n,m,i,temp;
    char cmd;
    while(~scanf("%d%d",&n,&m)){
        for(i=1;i<=n;i++)
            scanf("%d",&s[i]);
        build(0,n,1);
        for(i = 0;i < m;++i){
            getchar();
            scanf("%c %d %d",&cmd,&a,&b);
            if(cmd == 'Q')
                printf("%d\n",Query(a,b,1));
            else
                Update(0,n,1);
        }
    }
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!