hdu 1754

本文详细介绍了段树的构建、插入及查询操作的实现方法,并通过一个具体的示例代码展示了如何使用段树解决最大值更新和查询的问题。代码中还涉及了G++与C++在处理上的细微差别。
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<limits.h>
#include<string.h>
#define MAX 200000
#define L(x) (x<<1)
#define R(x) (x<<1|1)
using namespace std;
struct node 
{
    int l;
    int r;
    int val ;
}a[MAX*3];
int soc[MAX];
void build(int t,int l,int r)
{
    a[t].l=l;
    a[t].r=r;
    if(l>=r)
    {
        a[t].val=soc[l];
        return ;
    }
    int mid=(l+r)/2;
    build(L(t),l,mid);
    build(R(t),mid+1,r);
    a[t].val=max(a[L(t)].val,a[R(t)].val);
}
void insert(int t,int p,int v)
{
    int l=a[t].l;
    int r=a[t].r;
    int m=l+(r-l)/2;
    if(l==r) a[t].val=v;
    else
    {
        if(p<=m)
            insert(L(t),p,v);
        else
           insert(R(t),p,v); 
        a[t].val=max(a[L(t)].val,a[R(t)].val);
    }
}
int query(int t,int ql,int qr)
{
    int l=a[t].l;
    int r=a[t].r;
    int m=l+(r-l)/2;
    int ans=INT_MIN;
    if(ql<=l&&r<=qr)return a[t].val;
    if(ql<=m)ans=max(ans,query(L(t),ql,qr));
    if(m<qr)ans=max(ans,query(R(t),ql,qr));
    return ans;
}
int main()
{
    int m,n,i,j;
    char c;
    int p,v;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=1;i<=n;i++)
          scanf("%d",&soc[i]);
        build(1,1,n);
        for(i=0;i<m;i++)
        {
            cin>>c>>p>>v;
            if(c=='Q')
              printf("%d\n",query(0,p,v));
            else
              insert(1,p,v);

        }
    }
    return 0;
}
 用G++可以过,用c++wa,这是为什么
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值