C - I Hate It

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=221#problem/C

#include <stdio.h>
#include<string.h>
struct Node
{
    int sum;
    int l,r;
} node[800001];
int num[200001];
int max;
int max1(int x,int y)
{
    return x>y?x:y;
}
void build(int rt,int ll,int rr)
{
    if(ll==rr)
    {
        node[rt].l=node[rt].r=ll;
        node[rt].sum=num[ll];
        return;
    }
    node[rt].l=ll;
    node[rt].r=rr;
    int mid=(ll+rr)/2;

    build(rt*2,ll,mid);
    build(rt*2+1,mid+1,rr);
    node[rt].sum=max1(node[rt*2].sum,node[rt*2+1].sum);
}
void query(int rt,int s,int e)
{
    int mid;
    if(node[rt].l==s&&node[rt].r==e)
    {
        if(node[rt].sum>max)
            max = node[rt].sum;
            return ;
    }
    mid=(node[rt].l+node[rt].r)/2;
     if(s>mid)
        query(rt*2+1,s,e);
    else if(e<=mid)
        query(rt*2,s,e);
    else
    {
        query(rt*2,s,mid);
        query(rt*2+1,mid+1,e);
    }

}
void update(int rt,int pos,int v)
{
    if(node[rt].l==pos&&node[rt].r==pos)
    {
        node[rt].sum = v;
        return;
    }
    int mid;
    mid=(node[rt].l+node[rt].r)/2;
    if(pos<=mid)
    {
        update(rt*2,pos,v);
    }
    else
    {
        update(rt*2+1,pos,v);
    }

    node[rt].sum=max1(node[rt*2].sum,node[rt*2+1].sum);
}
int main()
{
    int i;
    int n,m;
    char ch[10];
    int x,y;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i = 1; i<=n; i++)
        {
            scanf("%d\n",&num[i]);
        }
        build(1,1,n);
        for(i = 1; i<=m; i++)
        {
            scanf("%s%d%d",ch,&x,&y);
            if(ch[0] == 'Q')
            {
                max = 0;
                query(1,x,y);
                printf("%d\n",max);
            }
            if(ch[0] == 'U')
                update(1,x,y);
        }
    }
    return 0;
}

线段树问题,二分思想。

posted @ 2014-08-08 20:35  HuberyQian  阅读(183)  评论(0编辑  收藏  举报