Cod sursa(job #1602705)

Utilizator alexandru.ghergutAlexandru-Gabriel Ghergut alexandru.ghergut Data 16 februarie 2016 21:36:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>

using namespace std;

void update(int index, int val, int bit[], int N)
{
    while (index <= N)
    {
        bit[index] += val;
        index += index & -index;
    }
}

int query(int index, int bit[], int N)
{
    int sum = 0;
    while (index > 0)
    {
        sum += bit[index];
        index -= index & -index;
    }
    return sum;
}

int query(int a, int b, int bit[], int N)
{
    return query(b, bit, N) - query(a - 1, bit, N);
}

int binarySearch(int left, int right, int val, int bit[], int N)
{
    int middle;
    while (right - left > 1)
    {
        middle = left + (right - left) / 2;
        if (query(middle, bit, N) >= val)
            right = middle;
        else
            left = middle;
    }

    if (right == N + 1 || query(right, bit, N) != val)
        return -1;

    return right;
}

int main()
{
    int N, M, i, a, b, op;
    ifstream f("aib.in");
    f >> N >> M;
    int bit[N + 1];
    fill(bit, bit + N + 1, 0);
    for (i = 1; i <= N; i++)
    {
        f >> a;
        update(i, a, bit, N);
    }

    ofstream g("aib.out");
    for (i = 1; i <= M; i++)
    {
        f >> op >> a;
        if (op == 0)
        {
            f >> b;
            update(a, b, bit, N);
        }
        else if (op == 1)
        {
            f >> b;
            g << query(a, b, bit, N) << '\n';
        }
        else if (op == 2)
            g << binarySearch(0, N + 1, a, bit, N) << '\n';

    }
    f.close();
    g.close();

    return 0;
}