HDU1754-ZKW线段树

时间:2023-03-08 22:14:47

单点更新,区间最值

HDU 1754

//
// Created by helica on 2018/3/18.
// //zkw线段树 单点修改 区间求最值
//HDU 1754 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> using namespace std;
const int N = + ; int M = ;
int T[N<<]; void change(int x, int v){
T[M+x] = v;
for(int p= (M+x)>>;p;p>>=) T[p] = max(T[p<<], T[p<<|]);
} int query(int s, int t){
int ans = -;
for (s=M+s-,t=M+t+; s^t^; s>>=, t>>=) {
if (~s&) ans = max(ans, T[s^]);
if ( t&) ans = max(ans, T[t^]);
}
return ans;
} int main(){
int n,q,op,s,t;
while(~scanf("%d %d", &n, &q)){
memset(T, , sizeof T); for(M=;M<n;M<<=);
for (int i=,tmp;i<n;i++) {
scanf("%d", &tmp);
change(i+, tmp);
} for(int i=;i<q;i++){
char op[];
scanf("%s %d %d", op, &s, &t);
if(op[] == 'U'){
change(s, t);
}else if(op[] == 'Q'){
printf("%d\n", query(s, t));
}
}
}
}