Cod sursa(job #1001161)

Utilizator manutrutaEmanuel Truta manutruta Data 24 septembrie 2013 16:53:19
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
# include <iostream>
# include <fstream>
using namespace std;

# define MAXN 100005
# define zero(x) (((x ^ (x - 1)) & x))

ifstream f("aib.in");
ofstream g("aib.out");

int c[MAXN], n, m;

void update(int i, int val)
{
    while (i <= n) {
        c[i] += val;
        i += zero(i);
    }
}

int query(int i)
{
    int s = 0;
    while (i > 0) {
        s += c[i];
        i -= zero(i);
    }

    return s;
}

int search(int sum)
{
    int step = 1;
    while(step<n) step <<= 1;

    for (int i = 0; step; step >>= 1)
    {
        if (i + step <= n)
        {
            if (c[i + step] > sum)
            {
                continue;
            }
            else if (c[i + step] == sum)
            {
                return i + step;
            }
            else
            {
                sum -= c[i];
                i += step;
            }
        }
    }

    return -1;
}

int main()
{
    f >> n >> m;
    for (int i = 1; i <= n; i++) {
        int aux;
        f >> aux;
        update(i, aux);
    }

    for (int i = 0; i < m; i++) {
        int op, a, b;
        f >> op >> a;
        switch (op) {
            case 0:
                f >> b;
                update(a, b);
                break;
            case 1:
                f >> b;
                g << query(b) - query(a - 1) << '\n';
                break;
            case 2:
                g << search(a) << '\n';
                break;
        }
    }

    return 0;
}