Cod sursa(job #2331480)

Utilizator andreibudacaBudaca Andrei andreibudaca Data 29 ianuarie 2019 17:12:29
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
using namespace std;

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

const int N_MAX = 100005;

int N;
int aib[N_MAX];

void update(int i, int val) {
    while (i <= N) {
        aib[i] += val;
        i += i & -i;
    }
}

int sum(int i) {
    int sol = 0;

    while (i) {
        sol += aib[i];
        i -= i & -i;
    }

    return sol;
}

int findMinPos(int val) {
    int l = 1, r = N;

    while (l <= r) {
        int m = (l + r) / 2;
        int suma = sum(m);

        if (suma == val)
            return m;
        else if (suma < val)
            l = m + 1;
        else
            r = m - 1;
    }

    return -1;
}

int main() {
    int m;
    in >> N >> m;
    for (int i = 1; i <= N; ++i) {
        int x;
        in >> x;

        update(i, x);
    }

    while (m--) {
        int cod;
        in >> cod;

        if (cod == 0) {
            int a, b;
            in >> a >> b;

            update(a, b);
        } else if (cod == 1) {
            int a, b;
            in >> a >> b;

            out << sum(b) - sum(a - 1) << '\n';
        } else {
            int a;
            in >> a;

            out << findMinPos(a) << '\n';
        }
    }
}