Cod sursa(job #2346070)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 17 februarie 2019 00:43:16
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <cmath>
#include <iostream>

using namespace std;

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

const int NMax = 1e5;

int N, M, AIB[NMax + 5], Log2[NMax + 5], K;

void Update(int P, int V)
{
    for(int i = P; i <= N; i += (i & (-i)))
        AIB[i] += V;
}

int Sum(int P)
{
    int Sol = 0;

    for(int i = P; i > 0; i -= (i & (-i)))
        Sol += AIB[i];

    return Sol;
}

int Search(int A)
{
    int P = 0;

    for(int k = (1 << K); k > 0; k >>= 1)
        if(P + k <= N && Sum(P + k) < A)
            P += k;

    return ((Sum(P + 1) == A) ? P + 1 : -1);
}

int main()
{
    fin >> N >> M;

    for(int i = 1, x; i <= N; i++)
        fin >> x, Update(i, x);

    K = log2(N);

    for(int i = 0, p, a, b; i < M; i++)
    {
        fin >> p >> a;

        if(p == 0)
            fin >> b, Update(a, b);
        if(p == 1)
            fin >> b, fout << Sum(b) - Sum(a - 1) << '\n';
        if(p == 2)
            fout << Search(a) << '\n';
    }
    fin.close();
    fout.close();

    return 0;
}