Cod sursa(job #2384302)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 20 martie 2019 16:49:24
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#define DIM 100005

using namespace std;

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

int n, m, i, a, b, cerinta;
int A[DIM];

inline void update (int i, int a){
    while (i <= n){
        A[i] += a;
        i += (i&-i);
    }
}

inline int query (int i){
    int sol = 0;
    while (i){
        sol += A[i];
        i -= (i&-i);
    }
    return sol;
}

inline int cautareBinara (int x){
    int st, dr, mid;
    st = 1, dr = n;
    while (st <= dr){
        mid = st + ((dr - st)>>1);
        if (query(mid) == x){
            return mid;
        }
        else if (query(mid) > x)
            dr = mid - 1;
        else
            st = mid + 1;
    }
    return -1;
}

int main(){
    fin >> n >> m;
    for (i=1; i<=n; i++){
        fin >> a;
        update (i, a);
    }
    for (i=1; i<=m; i++){
        fin >> cerinta;
        if (cerinta == 0){
            fin >> a >> b;
            update (a, b);
        }
        if (cerinta == 1){
            fin >> a >> b;
            fout << query(b) - query(a-1) << "\n";
        }
        if (cerinta == 2){
            fin >> a;
            fout << cautareBinara(a) << "\n";
        }
    }
    return 0;
}