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

 

你可能感兴趣的:(HDU)