Cod sursa(job #2022000)

Utilizator Chirita_MateiChirita Matei Chirita_Matei Data 15 septembrie 2017 11:50:39
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

#define zeros(x) (x&(x^(x-1)))
#define NMAX 100010
using namespace std;
ofstream fout("aib.out");
ifstream fin("aib.in");

int aib[NMAX], a, b, o, m, n;

void add(int poz, int x){
    for(int i = poz; i <= n; i += zeros(i)){
        aib[i] += x;
    }
}

int sum(int x){
    int sum = 0;

    for(int i = x; i >= 1; i -= zeros(i)){
        sum += aib[i];
    }

    return sum;
}

int bsearch(int x){
    int st = 1;
    int dr = n;

    while(st <= dr){
        int mij = (st + dr) / 2;
        int aux = sum(mij);
        if(aux == x){
            return mij;
        }

        else if(x < aux) dr = mij - 1;
        else st = mij + 1;
    }

    return -1;
}

int main()
{
    fin >> n >> m;

    for(int i = 1; i <= n; i++){
        fin >> a;
        add(i, a);
    }

    for(int i = 1; i <= m; i++){
        fin >> o;

        if(o == 0){
            fin >> a >> b;
            add(a, b);
        }

        else if(o == 1){
            fin >> a >> b;
            fout << sum(b) - sum(a-1) << '\n';
        }

        else if(o == 2){
            fin >> a;
            fout << bsearch(a) << '\n';
        }
    }

    return 0;
}