Cod sursa(job #1925204)

Utilizator M.AndreiMuntea Andrei Marius M.Andrei Data 12 martie 2017 17:01:38
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;

#define MAXN 100001
#define lsb(x) ((x) & (-x))

ifstream f{ "aib.in" };
ofstream q{ "aib.out" };

int n, m;
int aib[MAXN];

int sum(int idx)
{
   int sum = 0;
   for (; idx > 0; idx -= lsb(idx)) sum += aib[idx];
   return sum;
}

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

int query(int a, int b)
{
   return sum(b) - sum(a - 1);
}


int find(int a)
{
   int idx;
   for (idx = 1; idx < n; idx <<= 1);
   for(int i = 0; idx; idx >>=1)
   {
      if(i + idx <= n && a >= aib[i + idx])
      {
         i += idx;
         a -= aib[i];
      }
      if (a == 0) return i;
   }
   return -1;
}


int main()
{
   f >> n >> m;
   int x, op, a, b;
   
   for (int i = 1; i <= n; ++i) f >> x, update(i, x);

   while(m--)
   {
      f >> op;
      if (op == 0)
      {
         f >> a >> b;
         update(a, b);
      }
      else if (op == 1)
      {
         f >> a >> b;
         q << query(a, b) << "\n";
      }
      else
      {
         f >> a;
         q << find(a) << "\n";
      }
   }

   
   f.close();
   q.close();
   return 0;
}