HDU 1754 I Hate It(线段树维护点)

传送门

中文题目,题意也给安排的明明白白的。就是一个裸线段树的问题嘛,然后我就开始敲,敲玩跑了样例,没一点毛病,交一发,WA了,一下子给我干懵了,又读了一遍题发现是多组文件输入(吐血),然后把输入放while里,一交就过了。

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 2e6+10;
int n,m,a[maxn],tree[maxn*4];
void Build(int p,int l,int r)
{
    if(l == r)
    {
        tree[p] = a[l];
        return;
    }
    int mid = (l + r) / 2;
    Build(p * 2,l,mid);
    Build(p * 2 + 1,mid + 1,r);
    tree[p] = max(tree[p * 2],tree[p * 2 + 1]);
}
void Change(int p,int l,int r,int x,int y)
{
    if(l == r)
    {
        tree[p] = y;
        return;
    }
    int mid = (l + r) / 2;
    if(x <= mid)
        Change(p * 2,l,mid,x,y);
    else
        Change(p * 2 + 1,mid + 1,r,x,y);
    tree[p] = max(tree[p * 2],tree[p * 2 + 1]);
}
int Query(int p,int l,int r,int L,int R)
{
    if(L <= l && R >= r)
        return tree[p];
    int mid = (l + r) / 2;
    if(R <= mid)
        return Query(p * 2,l,mid,L,R);
    if(L > mid)
        return Query(p * 2 + 1,mid + 1,r,L,R);
    return max(Query(p * 2,l,mid,L,mid),Query(p * 2 + 1,mid + 1,r,mid + 1,R));
}
int main()
{
    while(~scanf("%d %d",&n,&m))
    {
        for(int i = 1;i <= n; i++)
            scanf("%d",&a[i]);
        Build(1,1,n);
        while(m--)
        {
            getchar();
            char c;
            scanf("%c",&c);
            if(c == 'Q')
            {
                int L,R,ans;
                scanf("%d %d",&L,&R);
                ans = Query(1,1,n,L,R);
                printf("%d\n",ans);
            }
            else if(c == 'U')
            {
                int x,y;
                scanf("%d %d",&x,&y);
                Change(1,1,n,x,y);
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao__hei__hei/article/details/87900478