void add(int row, int col, int val) {
     ++row, ++col;
     for (int i = row; i <= matrix_.size(); i += lower_bit(i)) {
         for (int j = col; j <= matrix_[0].size(); j += lower_bit(j)) {
             bit_[i][j] += val;
         }
     }
 }
 int sumRegion_bit(int row, int col) {
     ++row, ++col;
     int sum = 0;
     for (int i = row; i > 0; i -= lower_bit(i)) {
         for (int j = col; j > 0; j -= lower_bit(j)) {
             sum += bit_[i][j];
         }
     }
     return sum;
 }
Beispiel #3
0
 void add(int i, int val){
     i++;
     while(i<bit.size()){
         bit[i]+=val;
         i+=lower_bit(i);
     }
 }
 int query(const vector<int>& bit, int i) {
     int sum = 0;
     for (; i > 0; i -= lower_bit(i)) {
         sum += bit[i];
     }
     return sum;
 }
 int sumRegion_bit(int i) {
     ++i;
     int sum = 0;
     for (; i > 0; i -= lower_bit(i)) {
         sum += bit_[i];
     }
     return sum;
 }
Beispiel #6
0
 int query(int i){
     i++;
     int sum=0;
     while(i>0){
         sum+=bit[i];
         i-=lower_bit(i);
     }
     return sum;
 }
rank_t *
select_subms(subm_t * subms, int subms_len, rank_t ** ranks_ret) {
  rank_t * ranks = calloc(subms_len, sizeof(rank_t));
  int i = 0;
  for (; i < subms_len; i++) {
    ranks[i].subm = &subms[i];
  }
  sort_ranks_in_y(ranks, subms_len);
  subm_t * min_y = ranks[0].subm;
  rankp_t * rankps = calloc(subms_len, sizeof(rankp_t));
  i = 0;
  for (; i < subms_len; i++) {
    rankps[i].i = i;
    rankps[i].rank = &ranks[i];
  }
  //print_ranks(rankps, subms_len);
  sort_ranks_in_x(rankps, subms_len);
  //print_ranks(rankps, subms_len);
  i = 0;
  for (; i < subms_len; i++) {
    int rank_i = rankps[i].i;
    printf("i %d\n", i);
    rank_t * rank = rankps[i].rank;
    rank_t * prev = rank - 1;
    while (rank_i < subms_len) {
      if (rank->subm == min_y) {
        ranks[rank_i].first = rank;
        ranks[rank_i].rank = 1;
      } else if (prev->rank + 1 > ranks[rank_i].rank) {
        ranks[rank_i].first = rank;
        ranks[rank_i].prev = prev->first;
        ranks[rank_i].rank = prev->rank + 1;
      }
      rank_i += lower_bit(rank_i + 1);
      int t = 0;
      for (; t < subms_len; t++) {
        printf("%d ", ranks[t].rank);
      }
      puts("");
    }
  }
  free(rankps);
  rank_t * rank_ret = NULL;
  int max_rank = 0;
  i = 0;
  for (; i < subms_len; i++) {
    int rank = ranks[i].rank;
    if (rank > max_rank) {
      max_rank = rank;
      rank_ret = &ranks[i];
    }
  }
  * ranks_ret = ranks;
  return rank_ret;
}
 void add(vector<int>& bit, int i, int val) {
     for (; i < bit.size(); i += lower_bit(i)) {
         bit[i] += val;
     }
 }
 void add(int i, int val) {
     ++i;
     for (; i <= nums_.size(); i += lower_bit(i)) {
         bit_[i] += val;
     }
 }
Beispiel #10
0
int main(){
    printf("0x%X\n", lower_bit(0x78ABCDEF, 8));
    return 0;
}