Cod sursa(job #950321)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 16 mai 2013 15:49:20
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 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;
          }

      if(ans == 0 && !x)
        ans = -1;
      ++ans;
      if(ans != -1 && query(ans) != q)
        ans = -1;

      out << ans << "\n";
    }
  }

  return 0;
}