Cod sursa(job #1363956)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 27 februarie 2015 13:10:15
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

#define zeros(x)((x ^ (x - 1)) & x)

using namespace std;

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

const int N = 100001;

int n, m;
int aib[N];

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

int calculeaza(int x)
{
    int i, ret = 0;

    for(i = x; i > 0; i -= zeros(i))
        ret += aib[i];
    return ret;
}

int interogare(int a, int b)
{
    return calculeaza(b) - calculeaza(a - 1);
}

void citire()
{
    in >> n >> m;

    for(int i = 1; i <= n; i++)
    {
        int val;
        in >> val;
        adauga(i, val);
    }
}

int main()
{
    citire();

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

        if(tip == 2)
        {
            int a;
            in >> a;

            int j = 0, pas = 1 << 16;
            while(pas)
            {
                if(j + pas <= n && calculeaza(j + pas) < a)
                    j += pas;
                pas /= 2;
            }
            j++;
            if(calculeaza(j) == a)
                out << j << '\n';
            else
                out << -1 << '\n';
        }
        else
        {
            int a, b;
            in >> a >> b;

            if(tip == 0)
                adauga(a, b);
            else
                out << interogare(a, b) << '\n';
        }
    }
    return 0;
}