1. 程式人生 > >ZOJ 3279 樹狀陣列 題庫221頁

ZOJ 3279 樹狀陣列 題庫221頁

const  int  maxn =  100008 ;
int  x[maxn] , n ;

int  lowbit(int x){
     return x & (-x) ;
}

void  add(int i , int c){
      while(i <= n){
           x[i] += c ;
           i += lowbit(i) ;
      }
}

int   sum(int i){
      int s = 0 ;
      while(i >= 1){
           s += x[i] ;
           i -= lowbit(i) ;
      }
      return s ;
}

int   a[maxn]  ;

int  main(){
     int  i , m , d ;
     char ch[2] ;
     while(scanf("%d" , &n) != EOF){
           memset(x , 0 , sizeof(x)) ;
           for(i = 1 ; i <= n ; i++){
                scanf("%d" , &a[i]) ;
                add(i , a[i]) ;
           }
           scanf("%d" , &m) ;
           while(m--){
               scanf("%s" , ch) ;
               if(ch[0] == 'p'){
                    scanf("%d%d" , &i , &d) ;
                    add(i , d - a[i]) ;
                    a[i] = d ;
               }
               else{
                    scanf("%d" , &d) ;
                    int l = 1 , r = n , mid  , s ;
                    while(l <= r){
                         mid = (l + r) >> 1  ;
                         if(sum(mid) >= d){
                              s = mid ;
                              r = mid - 1 ;
                         }
                         else  l = mid + 1 ;
                    }
                    printf("%d\n" , s) ;
               }
           }
     }
     return 0 ;
}