HDU 1754 I Hate It

(更新点查询区间)

今天看了一下线段树方面的内容和例题,然后自己写了一个比较水的线段树题。。不过找错误找了好久,结果是把mid写成m了。。简直无语,写线段树绝对不能有小错误,很难找的。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 200005

struct node   //这里可以不用结构题,用一维数组就行了,节省空间。
{
    int maxi;
}tree[4*N];

int a[N];
int n,m;

void build(int l,int r,int rt)
{
    if(l==r)
    {
        tree[rt].maxi = a[l];
        return;
    }
    int mid = (l+r)/2;
    build(l,mid,2*rt);
    build(mid+1,r,2*rt+1);
    tree[rt].maxi = max(tree[2*rt].maxi,tree[2*rt+1].maxi);
}

void update(int l,int r,int aim,int val,int rt)
{
    if(l==r)
    {
        tree[rt].maxi = val;
        return;
    }
    int mid = (l+r)/2;
    if(aim<=mid)
        update(l,mid,aim,val,2*rt);
    else
        update(mid+1,r,aim,val,2*rt+1);
    tree[rt].maxi = max(tree[2*rt].maxi,tree[2*rt+1].maxi);
}

int query(int l,int r,int aa,int bb,int rt)
{
    if(aa>r||bb<l)
        return 0;
    if(aa<=l&&bb>=r)
        return tree[rt].maxi;
    int mid = (l+r)/2;
    return max(query(l,mid,aa,bb,2*rt),query(mid+1,r,aa,bb,2*rt+1));
}

int main()
{
    int i,aim,val;
    int aa,bb;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        build(1,n,1);
        char ch;
        for(i=0;i<m;i++)
        {
            getchar();
            scanf("%c",&ch);
            if(ch == 'Q')
            {
                scanf("%d%d",&aa,&bb);
                int res = query(1,n,aa,bb,1);
                cout<<res<<endl;
            }
            else
            {
                scanf("%d%d",&aim,&val);
                update(1,n,aim,val,1);
            }
        }
    }
    return 0;
}
View Code

作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com

原文地址:https://www.cnblogs.com/whatbeg/p/3485587.html