题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
题意就是求一段范围的成绩最大值,直接让线段树存储子节点的最大值便好。
还是子叶更新,没有难度。
向上更新
inline void pushup(int rt) //内联节约时间40ms
{
imax[rt] = max(imax[LS],imax[RS]);
}
区间求最大值
int query(int ql,int qr,int l,int r,int rt)
{
if(l >= ql && r <= qr)
{
return imax[rt];
}
int m = (r + l) >> 1;
int ret = 0;
if(ql <= m)
ret = max(ret,query(ql,qr,LSON));
if(qr > m)
ret = max(ret,query(ql,qr,RSON));
return ret;
}
AC代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#define LS rt << 1
#define RS rt << 1 | 1
#define LSON l,m,rt << 1
#define RSON m + 1,r,rt << 1 | 1
#define MAX 200000
using namespace std;
int imax[MAX << 2];
inline void pushup(int rt) //内联节约时间40ms
{
imax[rt] = max(imax[LS],imax[RS]);
}
void build(int l,int r,int rt)
{
if(l == r)
{
scanf("%d",&imax[rt]);
return ;
}
int m = (r + l) >> 1;
build(LSON);
build(RSON);
pushup(rt);
}
void update(int p,int date,int l,int r,int rt)
{
if(l == r)
{
imax[rt] = date;
return ;
}
int m = (l + r) >> 1;
if(p <= m)
update(p,date,LSON);
else
update(p,date,RSON);
pushup(rt);
}
int query(int ql,int qr,int l,int r,int rt)
{
if(l >= ql && r <= qr)
{
return imax[rt];
}
int m = (r + l) >> 1;
int ret = 0;
if(ql <= m)
ret = max(ret,query(ql,qr,LSON));
if(qr > m)
ret = max(ret,query(ql,qr,RSON));
return ret;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
build(1,n,1);
for(int i = 0;i <m;i++)
{
char s[10];
int a,b;
scanf("%s%d%d",s,&a,&b);
if(s[0] == 'U')
{
update(a,b,1,n,1);
}else if(s[0] == 'Q')
{
printf("%d\n",query(a,b,1,n,1));
}
}
}
return 0;
}