Fork me on GitHub

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

 

posted @ 2013-12-21 22:52  whatbeg  阅读(249)  评论(0编辑  收藏  举报