题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1754
题意:
题解:
线段树RMQ,单点更新,区间查询最大值
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MS(a) memset(a,0,sizeof(a))
#define MP make_pair
#define PB push_back
const int INF = 0x3f3f3f3f;
const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
inline ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
//////////////////////////////////////////////////////////////////////////
const int maxn = 2e5+10;
int mx[maxn<<2];
void pushup(int rt){
mx[rt] = max(mx[rt<<1],mx[rt<<1|1]);
}
void build(int l,int r,int rt){
if(l == r){
scanf("%d",&mx[rt]);
return ;
}
int mid = (l+r)/2;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void update(int l,int r,int rt,int p,int va){
if(l == r){
mx[rt] = va;
return ;
}
int mid = (l+r)/2;
if(p<=mid) update(l,mid,rt<<1,p,va);
else update(mid+1,r,rt<<1|1,p,va);
pushup(rt);
}
int query(int l,int r,int rt,int L,int R){
if(L<=l && r<=R){
return mx[rt];
}
int mid = (l+r)/2;
if(L>mid)
return query(mid+1,r,rt<<1|1,L,R);
if(R<=mid)
return query(l,mid,rt<<1,L,R);
return max(query(l,mid,rt<<1,L,R),query(mid+1,r,rt<<1|1,L,R));
}
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; int a,b;
cin >> op >> a >> b;
if(op == 'Q')
cout << query(1,n,1,a,b) << endl;
else
update(1,n,1,a,b);
}
}
return 0;
}