Cod sursa(job #1393236)

Utilizator radarobertRada Robert Gabriel radarobert Data 19 martie 2015 11:07:26
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

using namespace std;

int aib[100002];
int n;

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

void add(int pos, int val)
{
    for (int i = pos; i <= n; i += zeros(i))
        aib[i] += val;
}

int sum(int x)
{
    int result = 0;
    for (int i = x; i > 0; i -= zeros(i))
        result += aib[i];
    return result;
}


int main()
{
    ifstream in("aib.in");
    ofstream out("aib.out");

    int m;
    in >> n >> m;
    for (int x, i = 1; i <= n; i++)
    {
        in >> x;
        add(i, x);
    }

    int t, a, b;
    while (m--)
    {
        in >> t;
        if (t == 0)
        {
            in >> a >> b;
            add(a, b);
        }
        else if (t == 1)
        {
            in >> a >> b;
            out << sum(b) - sum(a-1) << '\n';
        }
        else
        {
            in >> a;

            int step;
            bool ok = false;
            for (step = 1; step < n; step <<= 1);
            for (int j = 0; step; step >>= 1)
            {
                if (j + step <= n)
                {
                    if (aib[j+step] <= a)
                    {
                        a -= aib[j+step];
                        j += step;
                        if (a == 0)
                        {
                            out << j << '\n';
                            ok = true;
                            break;
                        }
                    }
                }
            }
            if (!ok)
                out << "-1\n";
        }
    }

    return 0;
}