HDU 1754 I Hate It(线段树)

点我看题目

题意  :又是一道中问题,我就不说题意了。。。。

思路 : 线段树,这道题跟1166差不多,改一些地方就差不多了。

#include <iostream>

#include <stdio.h>

#include <string.h>

#include <math.h>



using namespace std;



const int maxn = 500005 ;

int a[maxn] ;

int ans ;

struct node

{

    int l,r,value ;

} Node[4*maxn] ;



void build(int v ,int l,int r)

{

    Node[v].l = l ;

    Node[v].r = r ;

    Node[v].value = 0;

    if(l == r)

    {

        return ;

    }

    int mid = (l+r)>>1 ;

    build(v*2,l,mid) ;

    build(v*2+1,mid+1,r) ;

}



int query(int v,int l,int r)

{

    if(Node[v].l == l && Node[v].r == r)

        return Node[v].value ;

    int mid = (Node[v].l+Node[v].r) >> 1 ;

    if(r <= mid)

        return query(v*2,l,r) ;

    else

    {

        if(l > mid)

            return query(v*2+1,l,r) ;

        else

            return max(query(v*2,l,mid),query(v*2+1,mid+1,r) );

    }

}



void update(int v,int n,int m)

{



    if(Node[v].value < m)

        Node[v].value = m ;

    if(Node[v].l == n &&  Node[v].r == n)

    {

        Node[v].value = m ;

        return  ;

    }

    else

    {

        int mid = (Node[v].l+Node[v].r)>>1 ;

        if(n <= mid)

            update(2*v,n,m) ;

        else if(n > mid)

            update(2*v+1,n,m) ;

    }

}







int main()

{

    int n,m ;

    while(~scanf("%d %d",&n,&m))

    {

        build(1,1,n) ;

        ans = 0;

        for(int i = 1 ; i <= n ; i++)

        {

            scanf("%d",&a[i]) ;

            update(1,i,a[i]) ;

        }



        char ch[31] ;

        for(int i = 1 ; i <= m ; i++)

        {

            getchar() ;

            scanf("%s",ch) ;

            int a,b ;

            if(ch[0] == 'Q')

            {

                scanf("%d %d",&a,&b) ;

                printf("%d\n",query(1,a,b)) ;

            }

            else if(ch[0] == 'U')

            {

                scanf("%d %d",&a,&b) ;

                update(1,a,b) ;

            }



        }

    }

    return 0;

}
View Code

 

你可能感兴趣的:(HDU)