Cod sursa(job #2372133)

Utilizator Tataru_AdelinTataru Adelin Tataru_Adelin Data 6 martie 2019 21:44:21
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>

using namespace std;

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

class AIB
{
public:
    vector <int> m_aib;
    int m_size;

    void update(int loc, int val)
    {
        for(;loc < m_size; loc += loc & (-loc))
            m_aib[loc] += val;
    }

    int query(int loc)
    {
        int ans = 0;

        for(;loc > 0; loc -= loc & (-loc))
            ans += m_aib[loc];

        return ans;
    }

    int query_int(int l, int r)
    {
        return query(r) - query(l - 1);
    }

    int get_pos(int val)
    {
        int i = 0, j = 1 << (31 - __builtin_clz(m_size));

        for(;j > 0; j >>= 1)
        {
            if(i + j <= m_size)
            {
                if(val >= m_aib[i + j])
                {
                    i += j;
                    val -= m_aib[i];

                    if(val == 0)
                    {
                        return i;
                    }
                }
            }
        }

        return -1;
    }

    AIB(int n, vector <int> &v)
    {
        m_aib = vector <int> (n + 1, 0);
        m_size = n + 1;

        for(int i = 0; i < n; i++)
            update(i + 1, v[i]);
    }
};

int main()
{
    int n, q;
    fin>>n>>q;
    vector <int> v(n);
    for(int i = 0; i < n; i++)
        fin>>v[i];

    AIB aib(n, v);

    int c, a, b;
    for(; q; q--)
    {
        fin>>c;
        switch(c)
        {
        case 0:
            fin>>a>>b;
            aib.update(a, b);
            break;
        case 1:
            fin>>a>>b;
            fout<<aib.query_int(a, b)<<'\n';
            break;
        case 2:
            fin>>a;
            fout<<aib.get_pos(a)<<'\n';
        }
    }
    return 0;
}