Cod sursa(job #954868)

Utilizator SmarandaMaria Pandele Smaranda Data 30 mai 2013 12:23:32
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>

using namespace std;

const long N = 100001;
long aib [N], n;

long lsb (long x){
    return x & (-x);
}

void update (long x, long value){
    long i;
    for (i = x; i <= n; i += lsb (i))
        aib [i] += value;
}

long query (long x){
    long ans = 0;
    while (x){
        ans += aib [x];
        x -= lsb (x);
    }
    return ans;
}

long Bs (long x){
    long i, step, ans = 0, val;
    step = 16;
    val = x;
    for (i = step - 1; i >= 0; i --)
        if (ans + (1 << i) <= n)
            if (aib [ans + (1 << i)] < x) {
                ans += (1 << i);
                x = x - aib [ans];
            }
    ans ++;
    if (query (ans) == val)
        return ans;
    return -1;
}

int main (){
    long m, i, a, t, b, ans, k;

    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);

    scanf ("%ld%ld", &n, &m);
    for (i = 1; i <= n; i ++){
        scanf ("%ld", &a);
        update (i, a);
    }
    for (i = 1; i <= m; i ++){
        scanf ("%ld", &t);
        if (t == 0){
            scanf ("%ld%ld", &a, &b);
            update (a, b);
        }
        if (t == 1){
            scanf ("%ld%ld", &a, &b);
            ans = query (b) - query (a - 1);
            printf ("%ld\n", ans);
        }
        if (t == 2){
            scanf ("%ld", &a);
            k = Bs (a);
            printf ("%ld\n", k);
        }
    }
    return 0;
}