Cod sursa(job #1383240)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 10 martie 2015 00:57:30
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>


int search(std::vector<std::size_t> &v, std::size_t sum)
{
    auto step = 1u;
    for (; step < v.size(); step <<= 1)
        ;

    auto i = 0u;
    for (; step; step >>= 1)
        if (i + step < v.size())
            if (sum > v[i + step]) {
                i += step;
                sum -= v[i];

                if (!sum)
                    return i;
            }

    return -1;
}

std::size_t query(std::vector<std::size_t> &v, std::size_t pos)
{
    auto sum = 0;

    for (auto i = static_cast<int>(pos); i > 0; i -= (i & -i))
        sum += v[i];

    return sum;
}

void update(std::vector<std::size_t> &v, std::size_t elem, std::size_t pos)
{
    for (auto i = pos; i < v.size(); i += (i & -i))
        v[i] += elem;
}

int main()
{
    std::ifstream fin{"aib.in"};
    std::ofstream fout{"aib.out"};

    std::size_t N, M;
    fin >> N >> M;

    std::vector<std::size_t> v(N + 1, 0);
    for (auto i = 1u; i <= N; ++i) {
        std::size_t elem;
        fin >> elem;

        update(v, elem, i);
    }

    while (M--) {
        int type;
        fin >> type;

        if (type == 1 || !type) {
            std::size_t a, b;
            fin >> a >> b;

            if (!type)
                update(v, b, a);
            else
                fout << query(v, b) - query(v, a - 1) << '\n';

        } else {
            std::size_t c;
            fin >> c;
            fout << search(v, c) << '\n';
        }
    }

    return 0;
}