Cod sursa(job #2610889)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 5 mai 2020 20:47:09
Problema Arbori indexati binar Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>

using namespace std;

constexpr int NMAX = 1e5 + 5;

int arb[4*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;

    scanf("%d%d", &x, &y);

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

void Tip_1 ()
{
    int x, y;

    scanf("%d%d", &x, &y);

    printf("%d\n", query(1, 1, N, x, y));
}

void Tip_2 ()
{
    int a;

    scanf("%d", &a);

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

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

        int now = query(1, 1, N, 1, m);

        if(now >= a)
            sol = m, val = now, dr = m - 1;
        else
            st = m + 1;
    }

    if(val != a)
        sol = -1;

    printf("%d\n", sol);
}

void Read_and_Solve ()
{
    int T;

    scanf("%d%d", &N, &T);

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

        scanf("%d", &x);

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

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

        scanf("%d", &x);

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

int main ()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    Read_and_Solve();

    return 0;
}