Cod sursa(job #2374630)

Utilizator GoogalAbabei Daniel Googal Data 7 martie 2019 19:43:14
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>

#define zeros(pos) ((pos ^ (pos - 1)) & pos)

using namespace std;

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

const int NMAX = 1e5;

int n, m;
int aib[1 + NMAX];


void add(int pos, int val){
  for(int i = pos; i <= n; i += zeros(i))
    aib[i] += val;
}

int computes(int pos){
  int answer = 0;

  for(int i = pos; i > 0; i -= zeros(i)){
    answer += aib[i];
  }
  return answer;
}

int src(int val){
  int pas = 1 << 17;
  int r = 0;
  int sum = 0;

  while(pas != 0){
    if(r + pas <= n){
      if(sum + aib[r + pas] <= val){
        sum += aib[r + pas];
        r += pas;
      }
    }
    pas /= 2;
  }

  if(sum == val)
    return r;
  else
    return -1;
}

int main()
{
  in >> n >> m;

  for(int i = 1; i <= n; i++){
    int x;

    in >> x;
    add(i, x);
  }

  for(int i = 1; i <= m; i++){
    int x, y, z;
    in >> x;

    if(x == 0){
      in >> y >> z;
      add(y, z);
    } else if(x == 1) {
      in >> y >> z;
      out << computes(z) - computes(y - 1) << '\n';
    } else if(x == 2) {
      in >> y;
      int res = src(y);
      if(res == 0)
        res = -1;
      out << res << '\n';
    }
  }

  in.close();
  out.close();

  return 0;
}