HDU 1754 I Hate It

线段树裸题。

单点修改+区间查询。

const int N=2e5+10;
struct Node
{
    int l,r;
    int maxv;
}tr[N<<2];
int score[N];
int n,m;

void pushup(int u)
{
    tr[u].maxv=max(tr[lc].maxv,tr[rc].maxv);
}

void build(int u,int l,int r)
{
    tr[u]={l,r};
    if(l == r)
    {
        tr[u].maxv=score[l];
        return;
    }

    int mid=l+r>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    pushup(u);
}

void modify(int u,int x,int v)
{
    if(tr[u].l == tr[u].r)  // 找到叶节点
    {
        tr[u].maxv=v;
        return;
    }
    int mid=tr[u].l+tr[u].r>>1;
    if(x <= mid) modify(lc,x,v);
    if(x > mid) modify(rc,x,v);
    pushup(u);
}

int query(int u,int l,int r)
{
    if(l <= tr[u].l && tr[u].r <= r)
        return tr[u].maxv;

    int mid=tr[u].l+tr[u].r>>1;
    int res=0;
    if(l <= mid) res=max(res,query(lc,l,r));
    if(r > mid) res=max(res,query(rc,l,r));
    return res;
}

int main()
{
    while(cin>>n>>m)
    {
        for(int i=1;i<=n;i++) scanf("%d",&score[i]);

        build(1,1,n);

        while(m--)
        {
            char op[2];
            int x,y;
            scanf("%s%d%d",op,&x,&y);
            if(*op == 'Q')
                cout<<query(1,x,y)<<endl;
            else
                modify(1,x,y);
        }
    }
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14671239.html