Cod sursa(job #1420552)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 18 aprilie 2015 17:55:55
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
// aib - suma pe interval - < N , logN >
#include <fstream>
#define Nmax 100009
#define LSB(x) (x&(-x))

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");
 
int N, M, aib[Nmax],val;
 
void upd(const int& poz, const int& x) {
  for(int i = poz;  i <= N;  i += LSB(i)) aib[i] += x;
}
 
int S(const int& poz) {
  int sum = 0;
  for(int i = poz; i > 0; i -= LSB(i)) sum += aib[i];
  return sum;
}
 
 
int searchAIB(int val) {
  int step = (1<<30);
  for(int i = 0;  step;  step >>= 1)
    if(i + step <= N && aib[i+step] <= val) {
        i += step;
        val -= aib[i];
        if(!val) return i;
    }
  return -1;
}

int main() {
  f >> N >> M;
  
  /* Initializare */
  for(int i = 1; i <= N; ++i)
      f >> val , upd(i, val);


  for(int i = 1; i <= M; ++i) {
    int op, a, b, val, poz;
    f >> op;
    if(!op) {
      f >> poz >> val;
      upd(poz, val);
      continue;
    }
    if(op==1) {
      f >> a >> b;
      g << S(b) - S(a-1) << '\n';
      continue;
    }
    
    if(op == 2) {
      f >> val;
      g << searchAIB(val) << '\n';
    }
  }

  f.close();g.close();
  return 0;
}