#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,这是为什么
hdu 1754
最新推荐文章于 2019-10-25 00:39:07 发布
本文详细介绍了段树的构建、插入及查询操作的实现方法,并通过一个具体的示例代码展示了如何使用段树解决最大值更新和查询的问题。代码中还涉及了G++与C++在处理上的细微差别。
918

被折叠的 条评论
为什么被折叠?



