Cod sursa(job #1156223)

Utilizator alexclpAlexandru Clapa alexclp Data 27 martie 2014 15:21:19
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>

using namespace std;

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

const int N = 100005;

int n, operatii, step;
int aib[N];

int query(int p)
{
    int sum = 0;

    while (p != 0) {
        sum += aib[p];
        p -= (p & -p);
    }
    return sum;
}

void update (int p, int val)
{
    while (p <= n) {
        aib[p] += val;
        p += (p & -p);
    }
}

void solve (int operatie, int a, int b)
{
    switch (operatie) {
        case 0: {
            update (a, b);

            break;
        }

        case 1: {
            int sum_a = query(a-1);
            int sum_b = query(b);

            out << sum_b - sum_a << "\n";

            break;
        }

        case 2: {
            int i = 0, pas = step;

            while (pas != 0) {
                if (i + pas <= n and aib[i + pas] <= a) {
                    a -= aib[i + pas];
                    i += pas;
                }

                pas /= 2;
            }

            if (a == 0) {
                out << i << "\n";
            } else {
                out << "-1\n";
            }

            break;
        }

        default:
            break;

    }
}

int main()
{
    in >> n >> operatii;

    for (int i = 1; i <= n; ++i) {
        int x;
        in >> x;

        update(i, x);
    }

    for (step = 1; step <= n; step <<= 1);

    for (int i = 1; i <= operatii; ++i) {
        int operatie, a = 0, b = 0;

        in >> operatie;
        if (operatie == 2) {
            in >> a;
            solve(operatie, a, b);
        } else {
            in >> a >> b;
            solve(operatie, a, b);
        }
    }

    return 0;
}