Cod sursa(job #2226649)

Utilizator AlexnolifeAlexandru Ica Alexnolife Data 30 iulie 2018 14:15:29
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <iostream>
#include <fstream>
#include <array>
#include <cstddef>

constexpr int NMAX = 100001;

std::array<int, NMAX> v;
std::size_t arraySize{ 0 };

std::ofstream g{ "aib.out" };

void UpdateBITree(std::size_t index, int value)
{
    for(std::size_t i = index; i <= arraySize; i += i & (-i)) {
        v[i] += value;
    }
}

int GetSum(std::size_t index) 
{
    int sum{ 0 };

    for(std::size_t i = index; i > 0; i -= i & (-i)) {
        sum += v[i]; 
    }

    return sum;
}

int GetSumInterval(std::size_t lo, std::size_t hi) 
{
    return GetSum(hi) - GetSum(lo - 1);
}

enum QueryType : int
{
    ADD = 0,
    SUM = 1, 
    POSITION = 2
};

void Read()
{
    std::ifstream f{ "aib.in" };

    std::size_t numOfQuerries{ 0 };
    std::size_t i{ 0 };
    int operation{ -1 };
    int number;

    f >> arraySize >> numOfQuerries;

    for(i = 1; i <= arraySize; ++i) {
        f >> number;

        UpdateBITree(i, number);
    }

    for(i = 1; i <= numOfQuerries; ++i) {
        f >> operation;

        switch(operation)
        {
            case ADD:
            {
                int a{ 0 }, b{ 0 };

                f >> a >> b;

                UpdateBITree(a, b);

                break;
            }
            case SUM:
            {
                int lo{ 0 }, hi{ 0 };

                f >> lo >> hi;

                g << GetSumInterval(lo, hi) << '\n';

                break;
            }
            case POSITION:
            {
                std::size_t k{ arraySize };
                int a{ 0 };
                bool found{ false };

                f >> a;

                while(!found) {
                    int s{ GetSum(k) };
                    
                    if(s == a) {
                        while(GetSum(k - 1) == a) {
                            --k;
                        }

                        g << k << '\n';

                        found = true;
                    }
                    else if(s > a) {
                        k /= 2;
                    }
                    else {
                        k += k / 2;
                    }
                }

                break;
            }
        }
    }
}

//void Solve()
//{
//}

int main()
{
    Read();
  //  Solve();
}