1. 程式人生 > >hdu1754 線段樹單點更新模板

hdu1754 線段樹單點更新模板

程式碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

#define ls(o) o<<1
#define rs(o) o<<1|1

const int maxn=800010;
struct node
{
    int l,r;
    int ans;
}nd[maxn];
int st[200010];
int n,m;

void build(int l,int r,int o)
{
    nd[o].l=l,nd[o].r=r;
    if(l==r)
    {
        nd[o].ans=st[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(l,mid,o<<1);
    build(mid+1,r,o<<1|1);
    nd[o].ans=max(nd[o<<1].ans,nd[o<<1|1].ans);
}

inline void add(int s,int o,int x)
{
    if(nd[o].l==nd[o].r&&nd[o].l==s)
    {
        nd[o].ans=x;
        return ;
    }
    int mid=(nd[o].l+nd[o].r)>>1;
    if(s<=mid) add(s,o<<1,x);
    else add(s,o<<1|1,x);
    nd[o].ans=max(nd[o<<1].ans,nd[o<<1|1].ans);
}

inline int query(int l,int r,int o)
{
    if(nd[o].l>=l&&nd[o].r<=r)
        return nd[o].ans;
    int mid=(nd[o].l+nd[o].r)>>1;
    if(r<=mid)
        return query(l,r,o<<1);
    else if(l>mid)
        return query(l,r,o<<1|1);
    else
        return max(query(l,mid,o<<1),query(mid+1,r,o<<1|1));
}

int main()
{
    ios::sync_with_stdio(false);
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&st[i]);
        build(1,n,1);
        getchar();
        for(int i=0;i<m;i++)
        {
            char c;
            int a,b;
            scanf("%c %d %d",&c,&a,&b);
            getchar();
            if(c=='Q')
            {
                int ans=query(a,b,1);
                printf("%d\n",ans);
            }
            else if(c=='U')
            {
                add(a,1,b);
            }
        }
    }
    return 0;
}