Cod sursa(job #2031060)

Utilizator juniorOvidiu Rosca junior Data 2 octombrie 2017 17:43:31
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
 
using namespace std;
 
#define dim 100001
#define p2(x) ((x ^ (x - 1)) & x)
 
int N, O, T, i, pi;
int Arb[dim];
ifstream fin("aib.in");
ofstream fout("aib.out");
 
void Adauga(int p, int v) {
  int i;
  for (i = p; i <= N; i += p2(i))
    Arb[i] += v;
}
 
int Suma(int p) { // suma pana la pozitia p
  int i, s = 0;
  for (i = p; i > 0; i -= p2(i))
    s += Arb[i];
  return s;
}
 
int Search(int v) {
  int i, p = pi;
  for (i = 0; p; p >>= 1)
    if (i + p <= N)
      if (Arb[i + p] <= v) {
        i += p, v -= Arb[i];
        if (v == 0)
          return i;
      }
  return -1;
}
 
int main() {
  int cod, a, b;
  fin >> N >> O;
  for (i = 1; i <= N; i++) {
    fin >> T;
    Adauga(i, T); // Adunam T la 0.
  }
  for (pi = 1; pi < N; pi <<= 1); // pasul initial pentru cautare
  while (O--) {   // operatiile
    fin >> cod; // codul operatiei
    if (cod < 2) {
      fin >> a >> b;
      if (cod == 0)
        Adauga(a, b);
      else
        fout << Suma(b) - Suma(a - 1) << '\n' ;
    }
    else {
      fin >> a;
      fout << Search(a) << '\n';
    }
  }
}