Cod sursa(job #2610891)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 5 mai 2020 20:52:04
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#define ub(x) (x&(-x))

using namespace std;

ifstream f ("aib.in");
ofstream g ("aib.out");

constexpr int NMAX = 1e5 + 5;
int aib[NMAX];
int N;

void Update (int poz, int val)
{
    for (int i = poz; i <= N; i += ub(i))
        aib[i] += val;
}

int Query (int poz)
{
    int S = 0;

    for (int i = poz; i > 0; i -= ub(i))
        S += aib[i];

    return S;
}

void Tip_0 ()
{
    int x, y;

    f >> x >> y;

    Update(x, y);
}

void Tip_1 ()
{
    int x, y;

    f >> x >> y;

    g << Query(y) - Query(x-1) << '\n';
}

void Tip_2 ()
{
    int x;

    f >> x;

    int st = 1, dr = N;
    int sol = -1;

    while (st <= dr)
    {
        int mij = (st + dr) / 2;

        int Sum = Query(mij);

        if (Sum < x) st = mij + 1;
        else if (Sum > x) dr = mij - 1;
        else
        {
            sol = mij;

            dr = mij - 1;
        }
    }

    g << sol << '\n';
}

void Read_and_Solve ()
{
    int T;

    f >> N >> T;

    for (int i = 1; i <= N; ++i)
    {
        int x;
        f >> x;

        Update(i, x);
    }

    for (; T; --T)
    {
        int task;

        f >> task;

        if (task == 0) Tip_0();
        if (task == 1) Tip_1();
        if (task == 2) Tip_2();
    }
}

int main()
{
    Read_and_Solve();

    return 0;
}