Cod sursa(job #2164737)

Utilizator futurengineerOana Rosca futurengineer Data 13 martie 2018 09:31:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>

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

using namespace std;

int n, op, pas_init, x, o, a[100005];

void adauga(int poz, int val) {
  for (int i = poz; i <= n; i += p2(i))
    a[i] += val;
}

int suma(int poz) {
  int s = 0;

  for (int i = poz; i > 0; i -= p2(i))
    s += a[i];
  return s;
}

int cauta(int val) {
  int pas = pas_init, i;
  for (i = 0; pas; pas >>= 1)
    if (i+pas <= n and a[i+pas] <= val) {
      i += pas; val -= a[i];
      if (!val)
        return i;
    }
  return -1;
}

int main () {
  int a, b;

  ifstream fi("aib.in");
  ofstream fo("aib.out");
  fi >> n >> op;
  for (pas_init = 1; pas_init < n; pas_init <<= 1);
  for (int i = 1; i <= n; i++)
    fi >> x, adauga(i, x);
  for (int i = 1; i <= op; i++) {
    fi >> o >> a;
    if (o == 0)
      fi >> b, adauga(a, b);
    else
      if (o == 1)
        fi >> b, fo << suma(b)-suma(a-1) << '\n';
      else
        fo << cauta(a) << '\n';
  }
  return 0;
}