树状数组求最值 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;
}

 

posted on 2012-09-26 11:23  yumao  阅读(250)  评论(0编辑  收藏  举报

导航