Cod sursa(job #3313677)

Utilizator Gerald123Ursan George Gerald123 Data 5 octombrie 2025 20:51:32
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

int i, aib[100010], n, m, v[100010], a, b, c;
void update(int p, int x)
{
  v[p] += x;
  for (int i = p; i <= n; i += (i & (-i)))
    aib[i] += x;
}

int qu1(int p)
{
  int s = 0;
  for (int i = p; i >= 1; i -= (i & (-i)))
  {
    s += aib[i];
  }
  return s;
}

int qu2(int s)
{
  int k = (1 << int(log2(n)));
  int x = 0;
  int sum = 0;
  while (k)
  {
    if (sum + aib[x + k] < s && x + k <= n)
    {
      x += k;
      sum += aib[x];
    }
    k /= 2;
  }
  sum+=qu1(x+1)-qu1(x);
  if (sum == s)
    return x+1;
  else
    return -1;
}

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  fin >> n >> m;
  int x;
  for (i = 1; i <= n; i++)
  {
    fin >> x;
    update(i, x);
  }

  for (i = 1; i <= m; i++)
  {
    fin >> c;
    if (c == 0)
    {
      fin >> a >> b;
      update(a, b);
    }
    else if (c == 1)
    {
      fin >> a >> b;
      fout << qu1(b) - qu1(a - 1) << '\n';
    }
    else
    {
      fin >> a;
      fout << qu2(a) << '\n';
    }
  }
  return 0;
}