HDU-1754-线段树-I Hate It

题意
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。
不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
思路
线段树 单节点更新

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 2000200;
int tree[maxn << 2];
void qmax(int rt)
{
    tree[rt] = max(tree[rt << 1], tree[(rt << 1) + 1]);

}
void build(int l, int r, int rt)
{
    if (l == r)
    {
        scanf("%d", &tree[rt]);
        return;
    }
    int m = (r + l) >> 1;
    build(l, m, rt << 1);
    build(m + 1, r, (rt << 1) + 1);
    qmax(rt);
}
void updata(int pos, int data, int l, int r, int rt)
{
    if (r == l)
    {
        tree[rt] = data;
        return; 
    }
    int m = (r + l) >> 1;
    if (pos <= m)
        updata(pos, data, l, m, rt << 1);
    else
        updata(pos, data, m + 1, r, (rt << 1) + 1);
    qmax(rt);

}
int query(int L, int R, int l, int r, int rt)
{
    if (L <= l&&R >= r)
    {
        return tree[rt];
    }
    int m = (r + l) >> 1;
    int ans = -1;
    if (L <= m)
        ans = max(ans, query(L, R, l, m, rt << 1));
    if (R > m)
        ans = max(ans, query(L, R, m + 1, r, (rt << 1) + 1));
    return ans;

}
int main(void)
{
    int n, m;
    while (~scanf("%d%d", &n, &m)){
        build(1, n, 1);
        for (int i = 0; i < m; i++)
        {
            char s;
            int x, y;
            cin >> s;
            scanf("%d%d", &x, &y);
            if (s == 'Q')
            {
                cout << query(x, y, 1, n, 1) << endl;

            }
            else
            {
                updata(x, y, 1, n, 1);
            }
        }
    }
    return 0;
}

你可能感兴趣的:(ACM)