Cod sursa(job #2439933)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 17 iulie 2019 11:30:22
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

int n;
vector<int> aib;

void Update(const int pos, const int val) {
  for (int i = pos; i <= n; i += (i & -i)) {
    aib[i] += val;
  }
}

int Sum(const int pos) {
  int sum = 0;
  for (int i = pos; i; i -= (i & -i)) {
    sum += aib[i];
  }
  return sum;
}

int main() {
  int m;
  is >> n >> m;
  aib = vector<int>(n + 1, 0);
  int val;
  for (int i = 1; i <= n; ++i) {
    is >> val;
    Update(i, val);
  }

  int type, x, y;
  while (m--) {
    is >> type >> x;
    switch (type) {
      case 0: 
      {
        is >> y;
        Update(x, y);
        break;
      }
      case 1: 
      {
        is >> y;
        const int sum = Sum(y) - Sum(x - 1);
        os << sum << "\n";
        break;
      }
      default: 
      {
        int st = 1, dr = n;
        do {
          const int md = st + ((dr - st) >> 1);
          const int sum = Sum(md);
          if (sum == x) {
            os << md << "\n";
            break;
          }
          if (sum > x) {
            dr = md - 1;
          } else {
            st = md + 1;
          }
        } while (st != dr);
        if (st == dr) {
          os << st << "\n";
        }
        break;
      }
    }
  }

  is.close();
  os.close();
  return 0;
}