Cod sursa(job #2610884)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 5 mai 2020 20:33:04
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>

using namespace std;

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

constexpr int NMAX = 1e5 + 5;

int arb[2*NMAX];
int N;

void update (int nod, int a, int b, int poz, int val)
{
    if (a == b)
    {
        arb[nod] += 1LL*val;

        return;
    }

    int mij = (a + b) / 2;

    if (poz <= mij) update(2*nod, a, mij, poz, val);
    else update(2*nod+1, mij+1, b, poz, val);

    arb[nod] = arb[2*nod] + arb[2*nod+1];
}

int query (int nod, int a, int b, int qa, int qb)
{
    if (qa <= a && b <= qb) return arb[nod];

    int mij = (a + b) / 2;
    int ans_1 = 0, ans_2 = 0;

    if (qa <= mij) ans_1 = query(2*nod, a, mij, qa, qb);
    if (mij < qb) ans_2 = query(2*nod+1, mij+1, b, qa, qb);

    return ans_1 + ans_2;
}

void Tip_0 ()
{
    int x, y;

    f >> x >> y;

    update(1, 1, N, x, y);
}

void Tip_1 ()
{
    int x, y;

    f >> x >> y;

    g << query(1, 1, N, x, y) << '\n';
}

void Tip_2 ()
{
    int a;

    f >> a;

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

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

        int sum = query(1, 1, N, 1, mij);

        if (sum < a) st = mij + 1;
        else if (sum > a) 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(1, 1, N, i, x);
    }

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

        f >> x;

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

int main ()
{
    Read_and_Solve();

    return 0;
}