hdu1754(线段树模版题)

http://acm.hdu.edu.cn/showproblem.php?pid=1754

View Code
#include<iostream>

using namespace std;

struct

{

    int l,r,max;

}s[200005*4];

int data[200005];

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

{

    int mid=(l+r)/2;

    if(l==r)

    {

        s[n].l=l;

        s[n].r=r;

        s[n].max=data[l];

    }

    else

    {

        s[n].l=l;

        s[n].r=r;

        build(l,mid,n*2);

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

        s[n].max=s[n*2].max>=s[n*2+1].max?s[n*2].max:s[n*2+1].max;

    }

}

int _max(int l,int r,int n)

{

    int mid=(s[n].l+s[n].r)/2;

    if(s[n].l==l&&s[n].r==r)

    {

        return s[n].max;

    }

    else

        if(r<=mid)

            _max(l,r,n*2);

        else

            if(l>mid)

                _max(l,r,n*2+1);

            else

            {

                int a,b;

                a=_max(l,mid,n*2);

                b=_max(mid+1,r,n*2+1);

                if(a>=b)

                    return a;

                else

                    return b;

            }

}

void updata(int i,int j,int n)

{

    int mid=(s[n].l+s[n].r)/2;

    if(s[n].l==i&&s[n].r==i)

    {

        s[n].max=j;

        int count=n/2;

        while(count>=1)

        {

            int a=s[count*2].max;

            int b=s[count*2+1].max;

            s[count].max=a>=b?a:b;

            count/=2;

        }

    }

    else

        if(i<=mid)

            updata(i,j,n*2);

            else

            if(i>mid)

                updata(i,j,n*2+1);

}

int main()

{

    int n,m;

    while(scanf("%d%d",&n,&m)>0)

    {

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

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

        getchar();

        build(1,n,1);

        char c;

        while(m--)

        {

            scanf("%c",&c);

            if(c=='Q')

            {

                int x,y;

                scanf("%d%d",&x,&y);

                printf("%d\n",_max(x,y,1));

            }

            else

                if(c=='U')

                {

                    int x,y;

                    scanf("%d%d",&x,&y);

                    updata(x,y,1);

                }

            getchar();

        }

    }

    return 0;

}

 

你可能感兴趣的:(HDU)