Cod sursa(job #173271)

Utilizator filipbFilip Cristian Buruiana filipb Data 7 aprilie 2008 16:11:42
Problema Arbori indexati binar Scor Ascuns
Compilator cpp Status done
Runda Marime 1.21 kb
#include <stdio.h>

int N, M, A[100005];

void update(int x, int val)
{
    for (; x <= N; x += x^(x-1)&x)
        A[x] += val;
}

int query(int x)
{
    int r;
    
    for (r = 0; x; x -= x^(x-1)&x)
        r += A[x];
    return r;
}

int search(int x)
{
    int log, p;
    
    for (log = 1; log < N; log <<= 1);
    for (p = 0; log; log >>= 1)
    {
        if (p + log > N) continue;
        if (x >= A[p + log])
            p += log, x -= A[p];
    }
    return (!x ? p : -1);
}

int main(void)
{
    int i, v, tip, a, b;
    
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    scanf("%d %d", &N, &M);
    for (i = 1; i <= N; ++i)
    {
        scanf("%d", &v);
        update(i, v);
    }

    for (; M; --M)
    {
        scanf("%d", &tip);
        if (tip == 0)
        {
            scanf("%d %d", &a, &b);
            update(a, b);
        }
        else if (tip == 1)
        {
            scanf("%d %d", &a, &b);
            printf("%d\n", query(b) - query(a-1));
        }
        else if (tip == 2)
        {
            scanf("%d", &a);
            printf("%d\n", (!a ? -1 : search(a)));
        }
    }

    return 0;
}