码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1754 I Hate It(单点更新,区间求最大值)

时间:2015-05-28 12:33:23      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

题意:n个点m次操作,每次操作给出c,a,b;若c为‘Q’,则查询【a,b】区间最大值;若c为‘U’,将第a个点更新为b;

思路:线段树单点更新,区间求极值;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int tree[5000010];
int a,b,c;
void pushup(int pos)
{
    tree[pos]=max(tree[2*pos],tree[2*pos+1]);
}
void build(int l,int r,int pos)
{
    int mid=(l+r)/2;
    if(l==r)
    {
        scanf("%d",&tree[pos]);
        return;
    }
    build(l,mid,2*pos);
    build(mid+1,r,2*pos+1);
    pushup(pos);
}
void update(int p,int val,int l,int r,int pos)
{
    int mid=(l+r)/2;
    if(l==r)
    {
        tree[pos]=val;
        return;
    }
    if(p<=mid) update(p,val,l,mid,2*pos);
    else update(p,val,mid+1,r,2*pos+1);
    pushup(pos);
}/**/
int query(int L,int R,int l,int r,int pos)
{
    int mid=(l+r)/2;
    if(L<=l&&r<=R)
    {
        return tree[pos];
    }
    int mm=0;
    if(L<=mid)
        mm=max(mm,query(L,R,l,mid,2*pos));
    if(mid<R)
        mm=max(mm,query(L,R,mid+1,r,2*pos+1));
    return mm;
}
int main()
{
    int i,j,k;
    char ch;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        build(1,n,1);
        for(i=0;i<m;i++)
        {
            getchar();
            scanf("%c%d%d",&ch,&b,&c);
            if(ch==Q)
                printf("%d\n",query(b,c,1,n,1));
            else
            {
                update(b,c,1,n,1);
            }
        }
    }
    return 0;
}

 

HDU 1754 I Hate It(单点更新,区间求最大值)

标签:

原文地址:http://www.cnblogs.com/dashuzhilin/p/4535482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!