树状数组区间最值入门模板题——I Hate It
I Hate It
这是一个简单的树状数组求区间最值的 入门模板题 涉及到了 单点修改 以及求区间最值的操作 熟悉这些函数的书写 就可以轻松的写出这个题
有关 树状数组求区间最值的内容 详见博客:
树状数组入门及例题讲解(三)——区间最值
本题代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
int a[200010],h[200010];
int lowbit(int x){
return x&(-x);
}
void update(int position){
int len_x;
while(position<=n){
len_x=lowbit(position);
h[position]=a[position];
for(int i=1;i<len_x;i<<=1){
h[position]=max(h[position],h[position-i]);
}
position+=len_x;
}
}
int find_max(int start,int end){
while(end>=start){
ans=max(ans,a[end]);
end--;
//这是那个单个比较的 我们这就不用if else 语句来做一个这个判断了 反正都是可以缩小我么的查询范围的好东西
while(end-lowbit(end)>start){
ans=max(h[end],ans);
end-=lowbit(end);
}
}
return ans;
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
update(i);
}
int p,q;
char ch;
for(int i=1;i<=m;i++){
getchar();
scanf("%c %d %d",&ch,&p,&q);
if(ch=='U'){
a[p]=q;
update(p);
}
else if(ch=='Q'){
printf("%d\n",find_max(p,q));
}
}
}
return 0;
}