Cod sursa(job #2343130)

Utilizator MaxTeoTeo Oprescu MaxTeo Data 13 februarie 2019 18:28:14
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
#define lastBit(x) (x & (-x))
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

const int MAX = 1e5 + 5;

int n, m;
int aib[MAX];

int Sum(int x)
{
    int sum = 0;
    for(; x; x -= lastBit(x))
        sum += aib[x];
    return sum;
}

int Sum(int a, int b)
{
    return Sum(b) - (a == 1 ? 0 : Sum(a - 1));
}

void Update(int idx, int value)
{
    for(; idx <= n; idx += lastBit(idx))
        aib[idx] += value;
}

int Binary_Search(int val)
{
    int j, pas;

    for(pas = 1; pas < n; pas <<= 1);
    for(j = 0; pas; pas >>= 1)
    {
        if(j + pas <= n && aib[j + pas] <= val)
        {
            j += pas;
            val -= aib[j];
            if(val == 0)
                return j;
        }
    }

    return -1;
}

void Solve()
{
    int op, a, b;

    while(m--)
    {
        f >> op;
        switch(op)
        {
            case 0: f >> a >> b;      Update(a, b);              break;
            case 1: f >> a >> b; g << Sum(a, b) << "\n";         break;
            case 2: f >> a;      g << Binary_Search(a) << "\n"; break;
        }
    }
}

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

    int x;
    for(int i = 1; i <= n; ++i)
    {
        f >> x;
        Update(i, x);
    }

    Solve();
    return 0;
}