ZOJ 3279 树状数组 题库221页

本文介绍了一种使用树状数组实现区间更新和查询的方法。通过预处理数组和树状数组的基本操作,如lowbit计算、add更新及sum查询等,可以高效地解决区间更新与查询的问题。该方法适用于动态修改数组元素并快速获取指定前缀和的场景。


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 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值