HDU 1754 I Hate It 线段树单点更新求最大值

时间:2022-04-05 03:26:28

题目链接

线段树入门题,线段树单点更新求最大值问题。

#include <bits/stdc++.h>
using namespace std;
#define m ((l+r)>>1)
#define lson root<<1,l,m
#define rson root<<1|1,m+1,r
#define N 30005
struct Tree
{
int l,r,ans;
}tree[N<<];
void build(int root,int l,int r)
{
tree[root].l=l;
tree[root].r=r;
if(l==r){
scanf("%d",&tree[root].ans);
return ;
}
build(lson);
build(rson);
tree[root].ans=max(tree[root<<].ans,tree[root<<|].ans);
}
void update(int root,int l,int r,int pos,int val)
{
if(l==r){
tree[root].ans=val;
return ;
}
if(pos<=m) update(lson,pos,val);
if(pos>m) update(rson,pos,val);
tree[root].ans=max(tree[root<<].ans,tree[root<<|].ans);
}
int query(int root,int l,int r,int ll,int rr)
{
//查询区间包含当前区间
if(ll<=l&&rr>=r){
return tree[root].ans;
}
int cnt=-;
if(ll<=m)cnt=max(cnt,query(lson,ll,rr));
if(rr>m) cnt=max(cnt,query(rson,ll,rr));
return cnt;
}
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF){
build(,,n);
int a,b;char c[];
while(k--){
scanf("%s%d%d",c,&a,&b);
if(c[]=='U') update(,,n,a,b);
else{
if(a>b) swap(a,b);
printf("%d\n",query(,,n,a,b));
}
}
}
return ;
}