HDU 1754 I Hate It(区间最值问题、线段树)

** 题目链接 ** : [kuangbin带你飞]专题七 线段树 B - I Hate It

Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

题意

Description

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

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

Input

本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0

Output

对于每一次询问操作,在一行里面输出最高成绩。

思路

裸的模版题,线段树求解区间最值。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>

using namespace std;

const int N = 200009;
const int MAX = N*3;
int Sum[MAX];

void build(int l, int r, int k)
{
    if(l == r)
    {
        scanf("%d", &Sum[k]);
        return;
    }
    int mid = (l+r)>>1;
    build(l, mid, k<<1);
    build(mid+1, r, k<<1 | 1);
    Sum[k] = max(Sum[k<<1], Sum[k<<1 | 1]);
}

void update(int l, int r, int pos, int d, int k)
{
    if(l == r)
    {
        Sum[k] = d;
        return;
    }
    int mid = (l+r)>>1;
    if(pos<=mid)
        update(l, mid, pos, d, k<<1);
    else
        update(mid+1, r, pos, d, k<<1 | 1);
    Sum[k] = max(Sum[k<<1], Sum[k<<1 | 1]);
}

int find(int l, int r, int tol, int tor, int k)
{
    if(tol <= l && tor >= r)
        return Sum[k];
    int mid = (l+r)>>1;
    int ans = 0;
    if(tol <= mid)
        ans = max(ans, find(l, mid, tol, tor, k<<1));
    if(tor > mid)
        ans = max(ans, find(mid+1, r, tol, tor, k<<1 | 1));
    return ans;
}

int main()
{
    ios_base::sync_with_stdio(false);
    int n, m;
    while(~scanf("%d%d", &n, &m))
    {
        build(1, n, 1);
        char str[10];
        int i, j;
        while(m--)
        {
            scanf("%s%d%d", str, &i, &j);
            if(str[0] == 'U')
                update(1, n, i, j, 1);
            else
                printf("%d\n" ,find(1, n, i, j, 1));
        }
    }
    return 0;
}