码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1754 I Hate It 线段树单点更新

时间:2015-02-22 20:45:34      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

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

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

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

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 200010;
int n,s[maxn];
int segTree[4*maxn+10];
void build(int node,int l,int r)
{
    if(l == r) segTree[node] = s[l];
    else {
        build(node*2,l,(l+r)/2);
        build(node*2+1,(l+r)/2+1,r);
        segTree[node] = max(segTree[node*2],segTree[node*2+1]);
    }
}
void update(int node,int beg,int en,int ind,int x)
{
    if(beg == en) {
        segTree[node] = x;
        return;
    }
    int m = (beg+en)/2;
    if(ind <= m) update(node*2,beg,m,ind,x);
    else update(node*2+1,m+1,en,ind,x);
    segTree[node] = max(segTree[node*2],segTree[node*2+1]);
}
int query(int a,int b,int node,int l,int r)
{
    if(l > b || r < a) return 1<<31;
    if(a <= l && r <= b) return segTree[node];
    return max(query(a,b,node*2,l,(l+r)/2),query(a,b,node*2+1,(l+r)/2+1,r));
}
int main()
{
    int q;
    while(scanf("%d%d",&n,&q) != EOF) {
        memset(s,0,sizeof(s));
        for(int i = 1 ; i <= n ; i ++) scanf("%d",&s[i]);
        for(int i = 1 ; i < maxn*4+10 ; i ++) segTree[i] = 1<<31;
        build(1,1,n);
        while(q--) {
            char s[5];
            int a,b;
            scanf("%s%d%d",s,&a,&b);
            if(s[0] == ‘Q‘) {
                printf("%d\n",query(a,b,1,1,n));
            }else {
                update(1,1,n,a,b);
            }
        }
    }
    return 0;
}

HDU1754 I Hate It 线段树单点更新

标签:

原文地址:http://blog.csdn.net/area_52/article/details/43908817

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!