Cod sursa(job #1337489)

Utilizator juniorOvidiu Rosca junior Data 9 februarie 2015 04:44:20
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

using namespace std;

#define dim 100001
#define p2(x) ((x ^ (x - 1)) & x)

inline int Minim(int a, int b) {
  if (a < b) return a;
  return b;
}

int N, O, T, i;
int Arb[dim];
int C, S;
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 Sum) {
  int pos = N + 1, B;
  int limst = 0, limdr = N + 1;
  B = N;
  S = Suma(B);
  if ( S == Sum ) pos = N;
  while ( B ) {
    B = (limst + limdr) >> 1;
    S = Suma(B);
    if ( S > Sum ) {
      if ( limdr > B )
        limdr = B;
      B -= 1;
    }
    else
      if ( S == Sum )
        pos = Minim(pos, B), limdr = B, B -= 1;
      else {
        if ( limst < B )
          limst = B;
        B += 1;
      }
    if ( B <= limst )
      break;
    if ( B >= limdr )
      break;
  }
  if ( pos == N + 1 )
    return -1;
  return pos;
}

int main() {
  int cod, a, b;
  fin >> N >> O;
  for (i = 1; i <= N; i++) {
    fin >> T;
    Adauga(i, T); // Adunam T la 0.
  }
  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';
    }
  }
}