Cod sursa(job #2013735)

Utilizator Coroian_DavidCoroian David Coroian_David Data 22 august 2017 11:24:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>

#define MAX_N 100000

using namespace std;

FILE *f, *g;

void add(int i, int nr);

int n, m;

int aib[MAX_N + 1];

int pasul;

void readFile()
{
    f = fopen("aib.in", "r");

    fscanf(f, "%d%d", &n, &m);

    pasul = 1;
    while(pasul < n)
        pasul <<= 1;

    int i;
    int nr;
    for(i = 1; i <= n; i ++)
    {
        fscanf(f, "%d", &nr);

        add(i, nr);
    }
}

void add(int i, int nr)
{
    while(i <= n)
    {
        aib[i] += nr;

        i += i & (-i);
    }
}

int suma(int a)
{
    int rez = 0;

    while(a > 0)
    {
        rez += aib[a];

        a = a & (a - 1);
    }

    return rez;
}

int cautBin(int a)
{
    if(a == 0)
    {
        if(aib[1] > 0)
            return -1;

        return 1;
    }

    int pas = pasul;
    int i = 0;
    int c = a;

    while(pas != 0 && a > 0)
    {
        if(i + pas <= n && aib[i + pas] < a)
        {
            a -= aib[i + pas];

            i += pas;
        }


        pas >>= 1;
    }

    if(suma(i + 1) != c)
        return -1;

    return i + 1;
}

void ansQues()
{
    g = fopen("aib.out", "w");

    int type;
    int a, b;
    while(m > 0)
    {
        m --;

        fscanf(f, "%d", &type);

        if(type < 2)
        {
            fscanf(f, "%d%d", &a, &b);

            if(type == 0)
                add(a, b);

            else
                fprintf(g, "%d\n", suma(b) - suma(a - 1));
        }

        else
        {
            fscanf(f, "%d", &a);

            fprintf(g, "%d\n", cautBin(a));
        }
    }

    fclose(g);
}

int main()
{
    readFile();

    ansQues();

    return 0;
}