Cod sursa(job #2395136)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 2 aprilie 2019 11:42:36
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

using namespace std;

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

#define zeros(x) ((x ^ (x - 1)) & x)
const int N_MAX = 100001;

int N, M;
int AIB[N_MAX];

void add(int poz, int val) {
    for(int i = poz; i <= N; i += zeros(i))
        AIB[i] += val;
}

int sum(int poz) {
    int res = 0;
    for(int i = poz; i > 0; i -= zeros(i))
        res += AIB[i];
    return res;
}

int search(int val) {
    int step;
    for(step = 1; step < N; step <<= 1);
    for(int i = 0; step > 0; step >>= 1)
        if(i + step <= N)
            if(val >= AIB[i + step]) {
                i += step;
                val -= AIB[i];
                if(val == 0)
                    return i;
            }

    return -1;
}

int main() {
    in >> N >> M;
    int x;
    for(int i = 1; i <= N; ++i) {
        in >> x;
        add(i, x);
    }
    int tip, a, b;
    for(int i = 1; i <= M; ++i) {
        in >> tip >> a;
        switch(tip) {
        case 0:
            in >> b;
            add(a, b);
            break;
        case 1:
            in >> b;
            out << sum(b) - sum(a - 1) << '\n';
            break;
        case 2:
            out << search(a) << '\n';
        }
    }

    return 0;
}