Cod sursa(job #2250735)

Utilizator pinteastefanPintea Teodor Stefan pinteastefan Data 30 septembrie 2018 17:02:14
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>

using namespace std;
long long values[100001], arb[100001];

long long mub(long long n){
    return (n & (-n));
    // returns 2^(mub(i))
}

long long query (long long i){
    if (i == 0) {
        return 0;
    }
    else{
        return arb[i] + query(i- mub(i));
    }
}

long long binarySearch(long long x, long long n){
    long long position = 0;
    for (long long power = 20; power >= 0 ; power --){
        if (position  + (1 << power) <= n && arb[position + (1 << power)] <= x ){
            position += (1 << power);
            x -= arb[position];
        }
    }
    if ( x == 0 and position){
        return position;
    }
    else{
        return -1;
    }
}

void update(long long position, long long n, long long value){
    while(position <= n){
        arb[position] += value;
        position += mub(position);
    }
}

int main() {
    ifstream f ("aib.in");
    ofstream g ("aib.out");
    long long n, m;
    f >> n >> m;
    for (long long i = 1; i <= n; i++){
        f >> values[i];
        update(i, n, values[i]);
    }
    for (long long i = 1; i <= m; i ++){
        long long op;
        f >> op;
        if (op == 0){
            long long a, b;
            f >> a >> b;
            update(a, n, b);
        }
        if (op == 1){
            long long a, b;
            f >> a >> b;
            long long sum = 0;
            sum = query(b) - query(a - 1);
            g << sum << "\n";
        }
        if (op == 2){
            long long a, k = 0;
            f >> a;
            k = binarySearch(a, n);
            g << k << "\n";
        }
    }
    return 0;
}