I Hate it-HDU1754 点修改+区间最大值

题意:

很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,

现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

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

思路:

基本的线段树点修改+查询区间最大值

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int tree[MAXN<<2];int a[MAXN];
void push_up(int node)
{
    tree[node]=max(tree[node<<1],tree[node<<1|1]);
}
void build(int node,int l,int r)
{
    if(l==r)
    {
        tree[node]=a[l];return;
    }
    int mid=(l+r)>>1;
    build(node<<1,l,mid);
    build(node<<1|1,mid+1,r);
    push_up(node);
}
void update(int node,int l,int r,int i,int k)
{
    int mid=(l+r)>>1;
    if(l==r)
    {
        a[l]=k;tree[node]=k;
        return;
    }
    if(i<=mid)
        update(node<<1,l,mid,i,k);
    else
        update(node<<1|1,mid+1,r,i,k);
    push_up(node);
}
int query(int node,int l,int r,int x,int y)
{
    if(x<=l&&y>=r)
    {
        return tree[node];
    }
    int res=0;
    int mid=(l+r)>>1;
    if(x<=mid)
        res=max(res,query(node<<1,l,mid,x,y));
    if(y>mid)
        res=max(res,query(node<<1|1,mid+1,r,x,y));
    return res;
}
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,1,n);
        for(int i=1;i<=m;i++)
        {
            char str[3];
            scanf("%s",str);
            int x,y;
            if(str[0]=='Q')
            {
                scanf("%d%d",&x,&y);
                printf("%d\n",query(1,1,n,x,y));
            }
            else
            {
                scanf("%d%d",&x,&y);
                update(1,1,n,x,y);
            }
        }
    }
    return 0;
}
posted @ 2020-01-21 18:59  grass_lin  阅读(132)  评论(0编辑  收藏  举报