Cod sursa(job #1714788)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 9 iunie 2016 14:15:44
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <fstream>
#define InFile  "aib.in"
#define OutFile "aib.out"
#define MAX 100001

using namespace std;

void add (unsigned int position, unsigned int value);
unsigned int sum (unsigned int position);
unsigned int binsrc (unsigned int value);

unsigned int N, M;
unsigned short int A[MAX];
unsigned short int type;
unsigned int a, b;

int BIT[MAX];
unsigned int i;

unsigned int solution, k;

int main ()
{
    ifstream fin (InFile);
    ofstream fout (OutFile);
    fin >> N >> M;
    for (i=1; i<=N; i++)
    {
        fin >> A[i];
        add(i,A[i]);
    }
    for (i=1; i<=M; i++)
    {
        fin >> type;
        if (type == 0)
        {
            fin >> a >> b;
            add(a,b);
        }
        else if (type == 1)
        {
            fin >> a >> b;
            solution = sum(b) - sum(a-1);
            fout << solution;
            fout << '\n';
        }
        else
        {
            fin >> a;
            k = binsrc(a);
            fout << k;
            fout << '\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}

void add (unsigned int position, unsigned int value)
{
    while (position <= N)
    {
        BIT[position] += value;
        position += (position^(position-1))&position;
    }
}

unsigned int sum (unsigned int position)
{
    unsigned int sum=0;
    while (position > 0)
    {
        sum += BIT[position];
        position -= (position^(position-1))&position;
    }
    return sum;
}

unsigned int binsrc (unsigned int value)
{
    int k=1, i=0;
    while (k < N)
        k *= 2;
    while (k > 0)
    {
        if (i+k <= N)
        {
            if (sum(i+k) == value)
                return i+k;
            else if (sum(i+k) < value)
                i += value;
        }
        k /= 2;
    }
    return -1;
}