Cod sursa(job #998571)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 17 septembrie 2013 17:38:09
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>

using namespace std;

int n, aib[100005];

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

void update(int pos, int val){
  while(pos <= n){
    aib[pos] += val;
    pos += lsb(pos);
  }
}

int q1(int pos){
  int r_val = 0;
  while(pos > 0){
    r_val += aib[pos];
    pos -= lsb(pos);
  }
  return r_val;
}

int l, r, mid, last, t_sol;

int q2(int sum){
  l = 1;
  r = n;
  last = -1;
  while(l <= r){
    mid = (l + r) >> 1;
    t_sol = q1(mid);
    if(t_sol > sum)
      r = mid - 1;
    else if(t_sol < sum)
      l = mid + 1;
    else{
      r = mid - 1;
      last = mid;
    }
  }
  return last;
}

int main(){
  freopen("aib.in", "r", stdin);
  freopen("aib.out", "w", stdout);

  int m;
  scanf("%d%d", &n, &m);

  for(int i = 1; i <= n; ++i){
    int x;
    scanf("%d", &x);
    update(i, x);
  }

  for(int i = 1; i <= m; ++i){
    int tip;
    scanf("%d", &tip);

    if(tip == 0){
      int x, y;
      scanf("%d%d", &x, &y);
      update(x, y);
    }
    else if(tip == 1){
      int x, y;
      scanf("%d%d", &x, &y);
      printf("%d\n", q1(y) - q1(x - 1));
    }
    else{
      int x;
      scanf("%d", &x);
      printf("%d\n", q2(x));
    }
  }

  return 0;
}