Cod sursa(job #747791)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 11 mai 2012 20:50:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>

using namespace std;

const int maxn = 100005;

int n, m, aib[maxn], a, b, x, tip, v[maxn];

int lsb(int x)
{
    return (x & (x - 1)) ^ x;
}

void update(int a, int b)
{
    int i;
    for(i = a; i <= n; i += lsb(i))
        aib[i] += b;
}

int query(int a)
{
    int rez = 0, i;
    for(i = a; i >= 1; i -= lsb(i))
        rez += aib[i];
    return rez;
}

int cauta_binar(int x)
{
    int p, u, mij, sol = -1;
    p = 1;
    u = n;
    while(p <= u) {
        mij = (p + u) / 2;
        if(query(mij) == x) {
            sol = mij;
            u = mij - 1;
        }
        if(query(mij) > x)
            u = mij - 1;
        else p = mij + 1;
    }
    return sol;
}

int main()
{
    int i;
    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i = 1; i <= n; ++i) {
        scanf("%d", &v[i]);
        update(i, v[i]);
    }
    for(i = 1; i <= m; ++i) {
        scanf("%d", &tip);
        if(tip == 0) {
            scanf("%d %d", &a, &b);
            update(a, b);
        }
        if(tip == 1) {
            scanf("%d %d", &a, &b);
            printf("%d\n", query(b) - query(a - 1));
        }
        else if (tip == 2) {
            scanf("%d", &x);
            printf("%d\n", cauta_binar(x));
        }
    }
    return 0;
}