Cod sursa(job #1377063)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 5 martie 2015 19:54:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>

using namespace std;

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

const int N = 100001;

int n, m;
int aib[N];

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

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

int calculeaza(int x)
{
    int rez = 0;
    for(int i = x; i > 0; i -= zerou(i))
        rez += aib[i];
    return rez;
}

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

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

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

        if(tip == 2)
        {
            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
        {
            in >> a >> b;

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