Cod sursa(job #2513472)

Utilizator MichaelXcXCiuciulete Mihai MichaelXcX Data 23 decembrie 2019 10:55:37
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int NMAX = 100005;           //Marimea sirului
int N, M, Arb[NMAX];            //Variabile basic
int C, Sum, T;

inline int Minim(int a, int b) {
    return (a < b) ? a : b;
}

void Update(int, int);
int Query(int);
int Search(int);

int main(void)
{
    memset(Arb, 0, sizeof(Arb));
    int X, A, B;

    fin >> N >> M;
    for(int i = 1; i <= N; i++) {
        fin >> T;
        Update(i, T);
    }

    for(; M; M--) {
        fin >> X;

        if(X < 2) {
            fin >> A >> B;
            if(!X)
                Update(A, B);

            else
                fout << Query(B) - Query(A-1) << "\n";
        }
        else {
            fin >> A;
            fout << Search(A) << "\n";
        }
    }
}

int Search(int x)
{
    int i, step;
    for(step = 1; step < N; step <<= 1);

    for(i = 0; step; step >>= 1) {
        if(i + step <= N)
            if(x >= Arb[i + step]) {
                i += step;
                x -= Arb[i];
                if(!x)
                    return i;
            }
    }

    return -1;
}

void Update(int poz, int val)
{
    C = 0;
    while(poz <= N) {
        Arb[poz] += val;

        while(!(poz & (1 << C)))
            C++;

        poz += (1 << C);
        C += 1;
    }
}

int Query(int poz)
{
    C = 0, Sum = 0;
    while(poz > 0) {
        Sum += Arb[poz];
        while(!(poz & (1 << C)))
            C++;
        poz -= (1 << C);
        C += 1;
    }

    return Sum;
}