Cod sursa(job #2158681)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 10 martie 2018 15:12:01
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#define DMAX 100010

using namespace std;

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

int aib[DMAX], n;
int m;

void actualizareAIB(int val, int plec){
    for(int i = plec; i <= n; i+= i & (-i)){
        aib[i] += val;
    }
}

void citire(){
    in >> n >> m;
    for(int i = 1; i <= n; i++){
        int temp;
        in >> temp;
        actualizareAIB(temp, i);
    }
}

int sumaPanaIn(int indice){
    int suma = 0;
    for(int i = indice; i > 0; i-= i & (-i)){
        suma += aib[i];
    }
    return suma;
}

int cautPoz(int val){
    int st = 1, dr = n, mij;
    int pozitie = -1;
    while(st <= dr){
        mij = (st + dr) / 2;
        int suma = sumaPanaIn(mij);
        if(suma == val){
            pozitie = mij;
            dr = mij - 1;
        }else if(suma < val){
            st = mij + 1;
        }else if(suma > val){
            dr = mij - 1;
        }
    }
    return  pozitie;
}

void rezolvare(){
    for(int i = 1; i <= m; i++){
        int caz;
        in >> caz;
        if(caz == 0){
            int a, b;
            in >> a >> b;
            actualizareAIB(b, a);
        }else if(caz == 1){
            int a, b;
            in >> a >> b;
            out << sumaPanaIn(b) - sumaPanaIn(a - 1)<<'\n';
        }else{
            int a;
            in >> a;
            out << cautPoz(a) <<'\n';
        }

    }
}

int main() {
    citire();
    rezolvare();
    return 0;
}