Cod sursa(job #2157735)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 9 martie 2018 21:08:17
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#define DMAX 100001
#define pozBit(x) (x & (-x))

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+=pozBit(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-= pozBit(i)){
        suma += aib[i];
    }
    return suma;
}

int cautPoz(int val){//prin scaderi
    int indicePoz = 0, index;
    for(index = 1; index <= n; index = index<<1);
    for(; index > 0; index = index >> 1){
        if(index + indicePoz <= n && val >= aib[index + indicePoz]){
            indicePoz += index;
            val-=aib[indicePoz];
            if(!val){
                return indicePoz;
            }
        }
    }
    return -1;
}

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

        }
    }
}

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