HDU-1754-线段树-I Hate It

来源:互联网 发布:绵阳编程培训学校 编辑:程序博客网 时间:2024/06/02 02:18

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

#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;}
0 0
原创粉丝点击