Cod sursa(job #1199295)

Utilizator c0rn1Goran Cornel c0rn1 Data 18 iunie 2014 19:25:37
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;
int n, m, aib[Nmax];

inline int _2lanr0(int x)
{
   return x&(x^(x-1));
}

void adaugare(int p, int x)
{
   while (p<=n)
   {
      aib[p]+=x;
      p+=_2lanr0(p);
   }
}

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

int suma(int p)
{
   int sum=0;
   while (p>0)
   {
      sum+=aib[p];
      p-=_2lanr0(p);
   }
   return sum;
}

int caut_bin(int x)
{
   int st=1, dr=n, m, ss;
   while (st!=dr)
   {
      m=(st+dr)/2;
      ss=suma(m);
      if (ss>=x)
         dr=m;
      else
         st=m+1;
   }
   if (x==suma(st))
      return st;
   return -1;
}

int main()
{
   freopen("aib.in", "r", stdin);
   freopen("aib.out", "w", stdout);
   int i, x, q, w;
   Citire();
   for (i=1; i<=m; i++)
   {
      scanf("%d", &x);
      if (x==0)
      {
         scanf("%d %d", &q, &w);
         adaugare(q, w);
      }
      else if (x==1)
      {
         scanf("%d %d", &q, &w);
         printf("%d\n", suma(w)-suma(q-1));
      }
      else if (x==2)
      {
         scanf("%d", &q);
         printf("%d\n", caut_bin(q));
      }
   }
   return 0;
}