Cod sursa(job #3303393)

Utilizator cutuslabutuNegrila Florin cutuslabutu Data 15 iulie 2025 13:24:13
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;
const int Max = 5e5 + 10;
ifstream f("aib.in");
ofstream g("aib.out");
int N, q;

int lsb(int k)
{
  return k & -k;
}

struct AIB
{
  vector<long long> aib;

  AIB(int n)
  {
    aib.resize(n + 1);
  }

  long long query(int k)
  {
    long long sum = 0;
    if(k >= aib.size())
    {
       return -1;
    }
    for (int i = k; i > 0; i -= lsb(i))
    {
      sum += aib[i];
    }
    return sum;
  }
  void update(int k, int add)
  {
    for (int i = k; i < aib.size(); i += lsb(i))
    {
      aib[i] += add;
    }
  }
  int cbin(long long s)
  {
    int ans = 0;
    long long sum_ans = 0;
    for(int pas = (1 << 18); pas > 0; pas /= 2)
    {
      if(ans + pas >= aib.size()){continue;}
      if(sum_ans + aib[ans + pas] < s)
      {
        ans += pas;
        sum_ans += aib[ans];
      }
    }
    return ans + 1;
  }
};

int main()
{
  f >> N >> q;
  AIB aib(N);
  for(int  i = 1; i <= N; ++i)
  {
    int a;
    f >> a;
    aib.update(i, a);

  }
  while(q--)
  {
    cout << "f" << endl;
    int c;
    f >> c;
    if(c == 0)
    {
      int a, b;
      f >> a >> b;
      aib.update(a, b);
    }
    else if(c == 1)
    {
      int a, b;
      f >> a >> b;
      g << aib.query(b) - aib.query(a - 1) << '\n';
    }
    else
    {
      int a;
      f >> a;
      int b = aib.cbin(a);
      if(aib.query(b) == a)
      g << aib.cbin(a) << '\n';
      else
      g << -1 << '\n';
    }
  }
  

}