HDU 1754 I Hate It(线段树)

HDU 1754 I Hate It(线段树)

这道题是线段树的简单版~

话不多说,直接上代码!

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int sum[maxn*4];
int a[maxn];
void pushup(int root)  //求区间最大值
{
    sum[root]=max(sum[root*2],sum[root*2+1]);
}
void build(int l,int r,int root)  //建树
{
    if(l==r)
  {
      sum[root] = a[l];
     return;
 }
    int mid=(l+r)/2;
    build(l,mid,root*2);
    build(mid+1,r,root*2+1);
    pushup(root);
}
void Update(int num,int val,int l,int r,int root)  //更新值
{
    if(l==r&&num==l)
    {
        a[num]=val;
        sum[root]=a[num]; 
        return;
    }
    int mid=(l+r)/2;
    if(num<=mid)
        Update(num,val,l,mid,root*2);
    else
        Update(num,val,mid+1,r,root*2+1);
    pushup(root);//更新值的同时也要更新区间最大值
}
int Query(int be,int ed,int l,int r,int root)  //查询区间最大值
{
    if(be<=l&&r<=ed)  //返回区间子集的最大值
        return sum[root];
    int mid=(l+r)/2;
    int ans=0;
    if(be<=mid)
       ans=max(ans,Query(be,ed,l,mid,root*2));
    if(mid<ed)
       ans=max(ans,Query(be,ed,mid+1,r,root*2+1));
       return ans;
}
char s[10];  //切记不要定义在循环内,因为可以询问多次多个例子,多次内存会爆
int main() {
    int n,m;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        for(int i=1;i<=n;++i)
        {
            scanf("%d",&a[i]);
        }
        build(1,n,1);
        int x,y;
        while(m--)
        {
            scanf("%s",s);
            if(s[0]=='U')
            {
                scanf("%d %d",&x,&y);
                Update(x,y,1,n,1);
            }
            if(s[0]=='Q')
            {
                scanf("%d %d",&x,&y);
                printf("%d\n",Query(x,y,1,n,1));
            }
        }
    }
    return 0;
}

 

posted @ 2019-11-07 16:46  清蒸母猪  阅读(92)  评论(0编辑  收藏  举报