Cod sursa(job #1384367)

Utilizator laurenttlaurentiu pavel laurentt Data 11 martie 2015 05:40:07
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<vector>
#include<algorithm>
#include<fstream>
#include<iostream>
using namespace std;

int bit[100005];
int N,M;

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

void update(int pos, int el) {
  for(; pos <= N; pos += lsb(pos)) {
    bit[pos] += el;
  }
}

int query(int pos) {
  int sum = 0;
  for(; pos > 0; pos -= lsb(pos)) {
    sum += bit[pos];
  }
  return sum;
}

int binary_search(int el) {
  int hi = N, lo = 1;
  while(lo <= hi) {
    int mid = lo + (hi-lo)/2;
    if(query(mid) == el) {
      return mid;
    }
    else if(query(mid) > el) {
      hi = mid - 1;
    }
    else {
      lo = mid + 1;
    }
  }
  return -1;
}

int main() {
  ifstream fin ("aib.in");
  ofstream fout("aib.out");

  fin >> N >> M;
  for(int i = 1; i <= N; ++i) {
    int x; fin >> x;
    update(i, x);
  }

  for(int i = 1; i <= M; ++i) {
    int x; fin >> x;
    switch(x) {
    case 0:
      int pos, el; fin >> pos >> el;
      update(pos, el);
      break;
    case 1:
      int start, end; fin >> start >> end;
      fout << query(end) - query(start - 1) << '\n';
      break;
    case 2:
      int s; fin >> s;
      fout << binary_search(s) << '\n';
      break;
    default:
      break;
    }
  }
  
  return 0;
}