Cod sursa(job #1397163)

Utilizator Toast97Calin Farcas Toast97 Data 23 martie 2015 12:12:18
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>

using namespace std;

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

int AIB [100005], n, m;

int pas (int x)
{
    return (x ^ (x-1)) & x;
}

void adauga (int poz, int val)
{
    int i;

    for (i = poz; i <= n; i += pas (i))
        AIB[i] += val;
}

int suma (int poz)
{
    int i, rez = 0;

    for (i = poz; i > 0; i -= pas (i))
        rez += AIB[i];

    return rez;
}

void creare ()
{
    f >> n >> m;

    int nr;

    for (int i = 1; i <= n; i ++)
    {
        f >> nr;

        adauga (i, nr);
    }
}

int cautare (int S)
{
    int i, pas;

    for (pas = 1; pas < n; pas *= 2)
        for (i = 0; pas != 0; pas /= 2)
            if (i + pas <= n && S >= AIB [i + pas])
    {
        i += pas;
        S -= AIB [i];
        if (!S)
            return i;
    }

    return -1;
}

int main()
{
    creare ();

    int tip, a, b;

    for (int i = 1; i <= m; i ++)
    {
        f >> tip;

        if (! tip)
        {
            f >> a >> b;
            adauga (a, b);
        }

        else if (tip == 1)
        {
            f >> a >> b;

            g << suma (b) - suma (a - 1) << '\n';
        }

        else
        {
            f >> a;

            g << cautare (a) << '\n';
        }
    }

    f.close ();
    g.close ();
    return 0;
}