Cod sursa(job #1163396)

Utilizator thebest001Neagu Rares Florian thebest001 Data 1 aprilie 2014 12:41:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <iostream>
using namespace std;


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

int aib[100001];
int n, m;
int maxPas  = 1;

void update(int x, int val) {
  while (x <= n) {
    aib[x] += val;
    x += x & (-x);
  }
}

int query(int x) {
  int rez = 0;
  while (x != 0) {
    rez += aib[x];
    x -= x & (-x);
  }
  return rez;
}

int cauta(int x) {
  int i = 0, pas = maxPas;
  while (pas != 0) {
    if (i + pas <= n && aib[i + pas] <= x) {
      x -= aib[i + pas];
      i += pas;
      if (x == 0) {
        return i;
      }
    }
    pas /= 2;
  }
  return -1;
}

int main() {

  in>>n>>m;
  for (; maxPas <= n; maxPas <<= 1);
  for (int i = 1; i <= n; i++) {
    int x;
    in>>x;
    update(i, x);
  }
  for (int i = 1; i <= m; i++) {
    int type;
    in>>type;
    if (type == 0) {
      int a, b;
      in>>a>>b;
      update(a, b);
    }
    if (type == 1) {
      int a, b;
      in>>a>>b;
      out<<query(b) - query(a - 1)<<"\n";
    }
    if (type == 2) {
      int a;
      in>>a;
      out<<cauta(a)<<"\n";
    }

  }
  return 0;
}