Cod sursa(job #2805368)

Utilizator victorzarzuZarzu Victor victorzarzu Data 21 noiembrie 2021 14:27:18
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <bits/stdc++.h>
#define zeros(x) ((x ^ (x - 1)) & x)
#define oo 0x3f3f3f3f

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int aib[100001], n, m, x, y, z;

void update(int position, int val)
{
  int i = position;
  for(;i <= n;i += zeros(i))
    aib[i] += val;
}

int query(int position)
{
  int sum = 0, i = position;
  for(;i >= 1;i -= zeros(i))
    sum += aib[i];

  return sum;
}

int found(int val)
{
  int res = 1;
  for(;res < n;res <<= 1);
  for(int i = 0;res;res >>= 1)
    if(i + res <= n && val >= aib[i + res])
    {
      i += res;
      val -= aib[i];
      if(!val)
        return i;
    }
  return -1;
}

void read()
{
  f>>n>>m;
  for(int i = 1;i <= n;++i)
    f>>x, update(i, x);
}

void solve()
{
  for(int i = 1;i <= m;++i)
  {
    f>>x;
    if(!x)
      f>>y>>z, update(y, z);
    else if(x == 1)
      f>>y>>z, g<<query(z) - query(y - 1)<<'\n';
    else
      f>>y, g<<found(y)<<'\n';
  }
}

int main()
{
  read();
  solve();
  return 0;
}