【题目】:HDU1754
【题意】:给出初始学生的成绩,然后有2个操作,一个操作是修改成绩, 一个操作是查询区间最大值。
【题解】:用维护区间最大值的方法进行更新。max【rt】=max(max【rt<<1】,max【rt<<1|1】);
【代码】:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int maxn=222222;
int MAX[maxn<<2];
void pushup(int rt){
MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
}
void Build(int l,int r,int rt){
if(l==r){
scanf("%d",&MAX[rt]);
return ;
}
int mid=(l+r)>>1;
Build(lson);
Build(rson);
pushup(rt);
}
void update(int p,int q,int l,int r,int rt){
if(l==r){
MAX[rt]=q;
return ;
}
int mid=(l+r)>>1;
if(p<=mid)update(p,q,lson);
else update(p,q,rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return MAX[rt];
}
int mid=(l+r)/2;
int ret=0;
if(L<=mid)ret=max(ret,query(L,R,lson));
if(R>mid)ret=max(ret,query(L,R,rson));
return ret;
}
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
Build(1,n,1);
for(int i=0;i<m;i++){
char op[2];
cin>>op;
if(op[0]=='Q'){
int a,b;
cin>>a>>b;
cout<<query(a,b,1,n,1)<<endl;
}
else{
int a,b;
cin>>a>>b;
update(a,b,1,n,1);
}
}
}
return 0;
}