题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
裸的单点更新
代码如下.
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <stack>
#include <string>
#include <cstring>
#include <cassert>
using namespace std;
typedef long long ll;
const int maxn=200005;
const int INF=0x7fffffff;
const int mod=1e7+7;
#define LSON l,m,rt<<1
#define RSON m+1,r,rt<<1|1
#define ESP 1e-7
int high[maxn<<2];
void pushup(int rt){
high[rt]=max(high[rt<<1],high[rt<<1|1]);//每个节点存区间最大值
}
void build(int l,int r,int rt){
if(l==r){
scanf("%d",&high[rt]);
return ;
}
int m=(l+r)>>1;
build(LSON);
build(RSON);
pushup(rt);
}
void update(int p,int newscore,int l,int r,int rt){
if(l==r){
high[rt]=newscore;
return ;
}
int m=(l+r)>>1;
if(p<=m) update(p,newscore,LSON);
else update(p,newscore,RSON);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return high[rt];
}
int m=(l+r)>>1,ans=-1;
if(L<=m) ans=max(ans,query(L,R,LSON));
if(R>m) ans=max(ans,query(L,R,RSON));
return ans;
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
build(1,n,1);
for(int i=0;i<m;i++){
char q[5];
int x,y;
scanf("%s%d%d",q,&x,&y);
if(q[0]=='Q') printf("%d\n",query(x,y,1,n,1));
else update(x,y,1,n,1);
}
}
return 0;
}