Cod sursa(job #1000659)

Utilizator manutrutaEmanuel Truta manutruta Data 23 septembrie 2013 15:38:34
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
# include <iostream>
# include <fstream>
using namespace std;

# define MAXN 100005

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

int c[MAXN], n, m;

void update(int i, int val)
{
    int poz = 0;
    while (i <= n) {
        c[i] += val;
        while (!(i & (1 << poz))) {
            poz++;
        }
        i += (1 << poz);
        poz++;
    }
}

int querry(int i)
{
    int s = 0, poz = 0;
    while (i > 0) {
        s += c[i];
        while (!(i & (1 << poz))){
            poz++;
        }
        i -= (1 << poz);
        poz++;
    }
    return s;
}

int search(int sum)
{
    int i;
    for (i = 0; sum != querry(i); i++);

    return i;
}

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 << querry(b) - querry(a - 1) << '\n';
                break;
            case 2:
                g << search(a) << '\n';
                break;
        }
    }

    return 0;
}