版权声明:限于博主能力有限,不排除出现错误的地方,希望大佬指出,多多 交流,共同进步。 https://blog.csdn.net/SunPeishuai/article/details/85452046
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 Input 本题目包含多组测试,请处理到文件结束。 Output 对于每一次询问操作,在一行里面输出最高成绩。 Sample Input 5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5 Sample Output 5 6 5 9 |
思路:在单点更新 区间求和的基础上面改动query和pushu的相加求和公式改为求最大值就欧克了
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200000+5;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
#define INF 1e9
int maxv[maxn*4];
void PushUP(int i)
{
maxv[i]=max(maxv[i*2],maxv[i*2+1]);
}
void build(int i,int l,int r)
{
if(l==r)
{
scanf("%d",&maxv[i]);
return;
}
int m=(l+r)/2;
build(lson);
build(rson);
PushUP(i);
}
int query(int ql,int qr,int i,int l,int r)
{
if(ql<=l&&qr>=r) return maxv[i];
int m=(l+r)/2;
int ans=-INF;
if(ql<=m) ans=max(ans,query(ql,qr,lson));
if(m<qr) ans=max(ans,query(ql,qr,rson));
return ans;
}
void update(int id,int val,int i,int l,int r)
{
if(l==r)
{
maxv[i]=val;
return;
}
int m=(r+l)/2;
if(id<=m) update(id,val,lson);
else update(id,val,rson);
PushUP(i);
}
int main()
{
int n,t;
while(scanf("%d%d",&n,&t)==2&&n&&t)
{
build(1,1,n);
for(int i=1;i<=t;i++)
{
char s1[5]; int a,b;
scanf("%s%d%d",s1,&a,&b);
if(s1[0]=='U')
{
update(a,b,1,1,n);
}
else if(s1[0]=='Q')
{
printf("%d\n",query(a,b,1,1,n));
}
}
}
return 0;
}