Cod sursa(job #1792428)

Utilizator OFY4Ahmed Hamza Aydin OFY4 Data 30 octombrie 2016 14:12:55
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>

using namespace std;

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

int aib[100007], n , Log;

void aibUpdate(int i, int s)
{
    for(; i <= n; i+= i & (-i))
        aib[i]+= s;
}

int aibQuery(int i)
{
    int s = 0;
    for(; i >= 1; i-= i & (-i))
        s+= aib[i];

    return s;
}

int cautBin(int s)
{
    int poz = 0;
    for(int i = Log; i >= 0; --i)
    {
        if((poz + (1 << i)) <= n && aib[poz + (1 << i)] < s)
        {
            poz+= 1 << i;
            s-= aib[poz];
        }
    }

    return poz + 1;
}

int main()
{
    int m, tp, a, b;

    in >> n >> m;

    for(Log = 1; (1 << Log) <= n; ++Log);
    --Log;

    for(int i = 1; i <= n; ++i)
    {
        in >> a;
        aibUpdate(i, a);
    }
    for(int i = 1; i <= m; ++i)
    {
        in >> tp;
        if(tp == 0)
        {
            in >> a >> b;
            aibUpdate(a, b);
        }
        else if(tp == 1)
        {
            in >> a >> b;
            out << aibQuery(b) - aibQuery(a - 1) << "\n";
        }
        else
        {
            in >> a;
            int poz = cautBin(a);

            if(aibQuery(poz) == a)
                out << poz << "\n";
            else out << "-1" << "\n";
        }
    }
}