Cod sursa(job #2614048)

Utilizator KPP17Popescu Paul KPP17 Data 11 mai 2020 09:26:52
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
//#define submit
#ifdef submit
    #define fisier "aib"
#else
    #define fisier "ULTRA"
#endif

#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");

const int
N = 100000,
M = 150000;

int n, m, v[N];

inline int primul_copil(int idx) {return ((idx+1) << 1) - 1;}
inline int al_doilea_copil(int idx) {return ((idx+1) << 1);}
inline int tata(int idx) {return ((idx+1) >> 1) - 1;}

void modifica_frunza(int idx_frunza, int val)
{
    for (int dif = val - v[idx_frunza]; idx_frunza != -1; idx_frunza = tata(idx_frunza))
        v[idx_frunza] += dif;
}

int frunza(int idx)
{
    int i = 0, j = n - 1, mij, idx_frunza = 0;
    //out << "\n\nsrch " << idx << std::endl;
    while (i != j)
    {
        //out << "i = " << i << ", j = " << j << std::endl;
        //out << "idx_frunza = " << idx_frunza << std::endl;
        mij = (i + j) >> 1;
        if (idx <= mij)
        {
            j = mij;
            idx_frunza = primul_copil(idx_frunza);
        }
        else
        {
            i = mij + 1;
            idx_frunza = al_doilea_copil(idx_frunza);
        }
    }

    //out << "i = " << i << ", j = " << j << std::endl;
    //out << "idx_frunza = " << idx_frunza << std::endl;
    return idx_frunza;
}

int interog_nod(int idx_nod, int off_i, int lun, int off_j)
{
    bool lun_imp = (off_i ^ lun ^ off_j) & 1;

    if (!off_i && !off_j)
        return v[idx_nod];
    if (lun + off_j <= off_i - lun_imp)
        return interog_nod(al_doilea_copil(idx_nod), ?, lun, off_j);
    if (off_i + lun <= off_j + lun_imp)
        return interog_nod(primul_copil(idx_nod), off_j, lun, ?);
    return
    interog_nod(primul_copil(idx_nod), off_j, ?, 0) +
    interog_nod(al_doilea_copil(idx_nod), 0, ?, off_i);
}

inline void modifica(int idx, int val) {modifica_frunza(frunza(idx), val);}
inline int interogare_suma(int i, int j) {return interog_nod(0, i, j - i + 1, n - j - 1);}


int main()
{
    in >> n >> m;

    for (int i = 0; i < n; i++)
    {
        frunza(i);
    }
}