Cod sursa(job #2193774)

Utilizator lucametehauDart Monkey lucametehau Data 11 aprilie 2018 15:09:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>

using namespace std;

ifstream cin ("aib.in");
ofstream cout ("aib.out");

const int nmax = 100000;

int n, m;
int type, a, b;

int v[1 + nmax];
int aib[1 + nmax];

int lsb(int n) {
  return n & -n;
}

void update(int index, int value) {
  for(; index <= n; index += lsb(index))
    aib[index] += value;
}

int query(int index) {
  int answer = 0;
  for(; index; index -= lsb(index))
    answer += aib[index];
  return answer;
}

int search(int value) {
  int pas = 0, step = (1 << 17);
  for(; step; step >>= 1)
    if(pas + step <= n && value >= aib[pas + step]) {
      value -= aib[pas + step];
      pas += step;
      if(value == 0)
        return pas;
    }
  return -1;
}

int main() {
  cin >> n >> m;
  for(int i = 1; i <= n; i++) {
    cin >> v[i];
    update(i, v[i]);
  }
  for(int i = 1; i <= m; i++) {
    cin >> type;
    if(type == 0) {
      cin >> a >> b;
      update(a, b);
    } else if(type == 1) {
      cin >> a >> b;
      cout << query(b) - query(a - 1) << "\n";
    } else {
      cin >> a;
      cout << search(a) << "\n";
    }
  }
  return 0;
}