树状数组求最值 hdu 1754
模板题,木有什么好说的。。。
直接上模板吧~
代码实现:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int num[200050];
int tree[200050];
int n;
int bit(int x){
return x&(-x);
}
int insert(int p,int v){
num[p]=v;
for(int k=p;k<=n;k+=bit(k)){
if(tree[k]<v){
tree[k]=v;
}
else
break;
}
return 0;
}
int change(){
for(int k=1;k<=n;k++){
tree[k]=num[k];
for(int g=1;g<bit(k);g<<=1){
if(tree[k]<tree[k-g]){
tree[k]=tree[k-g];
}
}
}
return 0;
}
int getmax(int a,int b){
int res=num[b];
while(1){
if(res<num[b])
res=num[b];
if(a==b)
break;
for(b=b-1;b-a>=bit(b);b-=bit(b)){
if(res<tree[b])
res=tree[b];
}
}
return res;
}
int main(){
int m;
while(scanf("%d%d",&n,&m)!=EOF){
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++){
int temp;
scanf("%d%*c",&temp);
num[i]=temp;
}
change();
// getchar();
for(int j=1;j<=m;j++){
char temp1;
int temp2,temp3;
char cha[10];
gets(cha);
scanf("%c%d%d%*c",&temp1,&temp2,&temp3);
// cout<<temp1<<" "<<temp2<<" "<<temp3<<endl;
if(temp1=='Q')
printf("%d\n",getmax(temp2,temp3));
else{
insert(temp2,temp3);
}
}
}
return 0;
}
浙公网安备 33010602011771号