Cod sursa(job #229328)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 9 decembrie 2008 21:46:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>

using namespace std;

#define MAXN 100005
int N, M;
int v[MAXN], aib[MAXN];

inline int query(int poz)
{
    int Sum = 0;
    for (; poz; poz &= poz - 1)
        Sum += aib[poz];
    return Sum;
}

inline void add(int poz, int val)
{
    for (; poz <= N; poz += (poz ^ (poz - 1)) & poz)
        aib[poz] += val;
}

int main()
{
    freopen("aib.in", "rt", stdin);
#ifndef DEBUG
    freopen("aib.out", "wt", stdout);
#endif

    scanf("%d %d", &N, &M);
    for (int i = 1; i <= N; i++)
        scanf("%d", v + i),
        add(i, v[i]);

    for (int i = 0; i < M; i++)
    {
        int type;
        scanf("%d", &type);
        if (type == 0)
        {
            int poz, val;
            scanf("%d %d", &poz, &val);
            add(poz, val);
        }

        if (type == 1)
        {
            int l, r;
            scanf("%d %d", &l, &r);
            printf("%d\n", query(r) - query(l - 1));
        }

        if (type == 2)
        {
            int sum;
            scanf("%d", &sum);

            int poz = 0, step = 1 << 16;
            for (; step; step >>= 1)
                if (poz + step <= N && query(poz + step) <= sum)
                    poz += step;

            printf("%d\n", (query(poz) == sum) ? (poz - (poz == 0)) : -1);
        }
    }

    return 0;
}