HDU 1754 I Hate It(线段树)

来源:互联网 发布:网络市场调研的对象 编辑:程序博客网 时间:2024/05/21 13:55

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

#include <stdio.h>int max(int a, int b){    return a>b ? a:b;}int data[200005];typedef struct{    int l,r,maxn;} stu;stu T[1000010];void Build(int t,int l,int r){    T[t].l = l;    T[t].r = r;    int m = (l+r) / 2;    if(l == r)    {        T[t].maxn = data[l];        return ;    }    Build(2*t,l,m);    Build(2*t+1,m+1,r);    T[t].maxn = max(T[2*t].maxn,T[2*t+1].maxn);}int Query(int t,int x,int y){    int l = T[t].l;    int r = T[t].r;    if(l == x && r == y)        return T[t].maxn;    int m = (l+r)/2;    if(x <= m && y <= m)//如果给出区间全部属于左孩子        return Query(2*t,x,y);//查询左孩子        //否则,如果全都属于右孩子,查询右孩子    else if(x > m) return Query(2*t+1,x,y);    //否则,如果部分在左孩子,部分在右孩子    else return max(Query(2*t,x,m),Query(2*t+1,m+1,y));}void Updata(int t, int x, int der){    int l,r,m;    l = T[t].l;    r = T[t].r;    m = (l+r)/2;    if(l == r)    {        T[t].maxn = der;        return ;    }    if(x <= m)        Updata(2*t,x,der);//如果要修改的节点在左孩子区间内    else        Updata(2*t+1,x,der);//右孩子        //更新    T[t].maxn = max(T[2*t].maxn,T[2*t+1].maxn);}int main(){    int m,n,a,b;    int i;    char c;    while(scanf("%d%d",&n,&m) != EOF){        for(i = 1;i <= n;i++){            scanf("%d",&data[i]);        }        Build(1,1,n);        for(i = 0;i < m;i++){            getchar();            scanf("%c%d%d",&c,&a,&b);            if(c == 'Q'){                if(a > b){                int tem = a;                a = b;                b = tem;                }                printf("%d\n",Query(1,a,b));            }            else{                Updata(1,a,b);            }        }    }    return 0;}


0 0
原创粉丝点击