Cod sursa(job #2910371)

Utilizator ezluciPirtac Eduard ezluci Data 20 iunie 2022 10:33:09
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("aib.in");
ofstream fout ("aib.out");

const unsigned nMAX = 100e3;

int n, m;
unsigned aib[nMAX + 1];


void buildAIB()
{
   for (int i = 1; i <= n; ++i)
      if (i + (i & -i) <= n)
         aib[i + (i & -i)] += aib[i];
}


void updateAIB(int pos, unsigned val)
{
   for (; pos <= n; pos += (pos & -pos))
      aib[pos] += val;
}


unsigned queryAIB(int le, int ri)
{
   unsigned suma = 0, sumb = 0;

   for (int i = ri; i >= 1; i -= (i & -i))
      sumb += aib[i];
   for (int i = le-1; i >= 1; i -= (i & -i))
      suma += aib[i];

   return sumb - suma;
}


int idkAIB(unsigned x)
{
   int st = 1, dr = n, sol = -1;
   while (st <= dr)
   {
      int mj = (st+dr) / 2;
      unsigned sum = queryAIB(1, mj);

      if (sum > x)
         dr = mj-1;
      else if (sum == x)
      {
         sol = mj;
         dr = mj-1;
      }
      else
         st = mj+1;
   }

   return sol;
}


int main()
{
   fin >> n >> m;

   for (int i = 1; i <= n; ++i)
      fin >> aib[i];

   buildAIB();

   for (int i = 1; i <= m; ++i)
   {
      int op;
      fin >> op;

      if (op == 0)
      {
         unsigned a, b;
         fin >> a >> b;
         updateAIB(a, b);
      }
      else if (op == 1)
      {
         unsigned a, b;
         fin >> a >> b;
         fout << queryAIB(a, b) << '\n';
      }
      else if (op == 2)
      {
         unsigned a;
         fin >> a;
         fout << idkAIB(a) << '\n';
      }
   }
}