Cod sursa(job #2226683)

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

constexpr int NMAX = 100001;

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

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

inline int bit(int i)
{
    return i & (-i);
}

void UpdateBITree(int index, int value)
{
    while(index <= arraySize) {
        v[index] += value;
        index += bit(index);
    }
}

int GetSum(int index) 
{
    int sum{ 0 };

    while(index > 0) {
        sum += v[index]; 
        index -= bit(index);
    }

    return sum;
}

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

int BinarySearch(int left, int right, const int val)
{
    if(left > right) {
        return -1;
    }

    int mid{ left + (right - left) / 2 };
    int sum{ GetSum(mid) };

    if(sum > val) {
        return BinarySearch(left, mid - 1, val);
    }
    else if(sum < val) {
        return BinarySearch(mid + 1, right, val);
    }
    else {
        return mid;
    }
}

int Search(int a)
{
    return BinarySearch(1, arraySize, a);
}

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

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

    int numOfQuerries{ 0 };
    int 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 };
                int b{ 0 };

                f >> a >> b;

                UpdateBITree(a, b);

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

                f >> lo >> hi;

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

                break;
            }
            case POSITION:
            {
                int a{};

                f >> a;

                g << Search(a) << '\n';
                
                break;
            }
        }
    }
}

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

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