Cod sursa(job #952462)

Utilizator primulDarie Sergiu primul Data 23 mai 2013 15:34:30
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
 
using namespace std;
 
int n, aib[100005];
 
inline int lsb(int &x){
  return x & -x; // ((x - 1) ^ x) + 1;
}
 
void update(int pos, int val){
  while(pos <= n){
    aib[pos] += val;
    pos += lsb(pos);
  }
}
 
int query(int pos){
  int ans = 0;
  while(pos){
    ans += aib[pos];
    pos -= lsb(pos);
  }
  return ans;
}
 
int main(){
  ifstream in("aib.in");
  ofstream out("aib.out");
 
  int m;
  in >> n >> m;
 
  for(int i = 1; i <= n; ++i){
    int x;
    in >> x;
    update(i, x);
  }
 
  for(int i = 1; i <= m; ++i){
    int tip;
 
    in >> tip;
 
    if(tip == 0){
      int pos, val;
 
      in >> pos >> val;
 
      update(pos, val);
    }
    else if(tip == 1){
      int l, r;
 
      in >> l >> r;
 
      out << query(r) - query(l - 1) << "\n";
    }
    else{
      int x, q;
 
      in >> x;
      q = x;
 
      int ans = 0;
      for(int i = 1 << 16; i > 0; i >>= 1)
        if(i + ans <= n)
          if(aib[ans + i] < x){
            x -= aib[ans + i];
            ans += i;
          }
 
      ++ans;
      if(ans != -1 && query(ans) != q)
        ans = -1;
 
      out << ans << "\n";
    }
  }
 
  return 0;
}