Cod sursa(job #2226659)

Utilizator AlexnolifeAlexandru Ica Alexnolife Data 30 iulie 2018 14:31:01
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 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);
}

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 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();
}