Cod sursa(job #2295050)

Utilizator Tataru_AdelinTataru Adelin Tataru_Adelin Data 3 decembrie 2018 00:37:33
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;

class AIB
{
    // variables
public:
private:
    int m_size;
    vector <int> m_aib;
    // functions
public:
    void update(int poz, int val)
    {
        for(; poz < m_size; poz += poz & (-poz))
        {
            m_aib[poz] += val;
        }
    }

    int getSum(int poz)
    {
        int sum = 0;

        for(; poz > 0; poz -= poz & (-poz))
        {
            sum += m_aib[poz];
        }

        return sum;
    }

    int getInterval(int i, int j)
    {
        return getSum(j) - getSum(i - 1);
    }

    int searchIndex(int sum)
    {
        int i = 0, j = 1 << (31 - __builtin_clz(m_size - 1));
        for(; j > 0; j >>= 1)
        {
            if(i + j < m_size)
            {
                if(sum >= m_aib[i + j])
                {
                    i += j;
                    sum -= m_aib[i];
                    if(sum == 0)
                    {
                        return i;
                    }
                }
            }
        }

        return -1;
    }

    void initialize(vector <int> &values)
    {
        m_size =  values.size();
        m_aib.reserve(m_size);

        for(int i = 1; i < m_size; i++)
            update(i, values[i]);
    }


    AIB()
    {}

    AIB(vector <int> &values)
    {
        initialize(values);
    }
private:

};

ifstream fin("aib.in");
ofstream fout("aib.out");

int main()
{
    int n, m;
    fin>>n>>m;
    vector <int> v(n+1);
    for(int i = 1; i <= n; i++)
        fin>>v[i];
    AIB aib(v);

    int op,a,b;
    for(; m; m--)
    {
        fin>>op;
        switch(op)
        {
        case 0:
            fin>>a>>b;
            aib.update(a, b);
            break;
        case 1:
            fin>>a>>b;
            fout<<aib.getInterval(a, b)<<'\n';
            break;
        case 2:
            fin>>a;
            fout<<aib.searchIndex(a)<<'\n';
            break;
        default:
            break;
        }
    }
    return 0;
}