Cod sursa(job #966040)

Utilizator cahemanCasian Patrascanu caheman Data 25 iunie 2013 10:11:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>

using namespace std;

int aib[136000], x;

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

int query(int poz)
{
  int p = poz, s = 0;
  while(p > 0)
  {
    s += aib[p];
    p = p - (p & (-p));
  }
  return s;
}

int cbaib(int val)
{
  int st, dr, med, s, last = -1;
  st = 1;
  dr = x;
  while(st <= dr)
  {
    med = (st + dr) >> 1;
    s = query(med);
    if(s < val)
      st = med + 1;
    else
    {
      dr = med - 1;
      if(s == val)
        last = med;
    }
  }
  return last;
}

int main()
{
  freopen("aib.in", "r", stdin);
  freopen("aib.out", "w", stdout);
  int n, m, op, a, b, val, i;
  scanf("%d%d", &n, &m);
  x = 1;
  while(x < n)
  {
    x += x;
  }
  for(i = 1; i <= n; ++ i)
  {
    scanf("%d", &val);
    update(i, val);
  }
  for(i = 1; i <= m; ++ i)
  {
    scanf("%d", &op);
    if(op == 0)
    {
      scanf("%d%d", &a, &val);
      update(a, val);
    }
    if(op == 1)
    {
      scanf("%d%d", &a, &b);
      printf("%d\n", query(b) - query(a - 1));
    }
    if(op == 2)
    {
      scanf("%d", &val);
      a = cbaib(val);
      printf("%d\n", a);
    }
  }
  return 0;
}